0
我有一个足球场预订网站--用户登录,然后选择他想预订的体育场,然后选择日期和他想预订多少罐装(一个小时或两个小时,等等。用户John在5日10点到12点预订了体育场X,我想确保在同一体育场、同一天和同一时间没有预订,如果在同一数据有预订,他没有完成预订
当我尝试使用外键过滤模型时,pitche filter = OpeningHours.objects.filter(made_on=self.made_on,pitche=self.pitche,period = self.period).filter(Q(from_hour__range=in_range))|Q(to_hour__range=in_range)).exists()
发生错误(relatedobjectdoesnotexist)OpeningHours没有间距。
我的模特是:
class Pitche(models.Model):
Name = models.CharField(max_length=50)
city =models.CharField(max_length=50)
photo = models.ImageField(upload_to='photos')
price = models.DecimalField(max_digits=5,decimal_places=2)
location = models.CharField(max_length=500)
name_of_supervisor = models.CharField(max_length=50)
phone_of_supervisor = models.CharField(max_length=11)
manager = models.ForeignKey(Manager,on_delete=models.DO_NOTHING)
class OpeningHours(models.Model):
user = models.ForeignKey(User,on_delete=models.CASCADE)
pitche = models.ForeignKey(Pitche,on_delete=models.DO_NOTHING)
made_on = models.DateField()
period = models.CharField(max_length=50,choices=period)
from_hour = models.TimeField()
to_hour = models.TimeField()
timing = models.CharField(max_length=50,choices=timing)
def __str__(self):
return f"{self.pitche}-{self.from_hour} to {self.to_hour}"
def clean(self):
if self.from_hour == self.to_hour:
raise ValidationError("Wrong Time")
if self.made_on <datetime.date.today():
raise ValidationError("InVaild Date")
#####################
in_range = (self.from_hour, self.to_hour)
filter = OpeningHours.objects.filter(made_on=self.made_on,period =
self.period).filter(Q(from_hour__range=in_range) |
Q(to_hour__range=in_range)).exists()
if filter:
raise ValidationError(f"The booked time ({self.from_hour} to
{self.to_hour}) is occupied.")
return super().clean()
和意见:
def pitche_page(request,id):
if request.method == 'POST' and request.user.is_authenticated :
pit_id = Pitche.objects.get(id =id )
add_date = RestaurantForm(request.POST)
if add_date.is_valid():
info =add_date.save(commit=False)
login_user = User.objects.get(username=request.user.username)
info.user = login_user
info.pitche = pit_id
info.save()
messages.success(request,"Booking Successful")
else:
messages.error(request,"this time is booked befor")
context ={
'pit':get_object_or_404(Pitche,id=id),
'form':RestaurantForm(),
}
return render(request,'pitches/pitche.html',context)
1条答案
按热度按时间jecbmhm31#
问题是,在清理时,
pitche
尚未设置(尚未),我们可以通过以下方式解决此问题:但这种清洁方法可能并不稳健。事实上,假设您想预订下午3:00到下午4:00的场地,并且有一个从下午2:00到下午5:00的预订,那么没有开始和结束日期在下午3:00到下午4:00的范围内,但是它被预订了。
为了解决这个问题,我们应该问自己,当两个范围不 * 总。也就是说,如果 e1<b2 或 e2<b1,其中 bi 和 ej 分别是开始和结束时间,因此这意味着如果 e1≥b2则e2≥b1。请注意,这并不考虑展期,因此从晚上11:00开始到凌晨1:00结束的预订,这使得它更加复杂。
对于简单的情况,在没有翻转的情况下,我们用以下方式检查:
这个时期也很奇怪:这由TimeField中的值暗示:如果选择
15:00
,时间是15:00
,这里用一个period
,意思是说如果有人用period='PM'
订5:00
和7:00
之间的话,另外一个人可以用17:00
和19:00
和period='AM'
或period='PM'
订,这样就不会出现“撞车”的情况。注意:通常使用**
settings.AUTH_USER_MODEL
[Django-doc]引用用户模型比直接使用User
模型[Django-doc]更好。有关更多信息,您可以查看文档的 * 引用User
模型 * 部分。注意:如果POST请求成功,需要创建
redirect
[Django-doc]来实现Post/Redirect/Get pattern [wiki]。这样可以避免在用户刷新浏览器时发出相同的POST请求。注意:虽然大多数表单不处理媒体文件,但最好还是将
request.FILES
**[Django-doc]传递给表单,这样,如果您稍后添加额外的媒体字段,所有使用表单的视图都会正确处理文件。