Django lte&检查日期范围时gte失败

时间:2016-06-15 11:13:16

标签: python django django-models django-forms django-views

我想检查已预订日期的日历,以便用户无法预订房间(如果已预订)。我用lte和gte来检查日期,到目前为止我对结果不满意。

型号:

class HotelCalendar(models.Model):
    user=models.ForeignKey(User)
    hotelrooms=models.ForeignKey(HotelRooms)
    checkin_booked_date=models.DateField(max_length=20, help_text='yy-mm-dd e.g. 2014-02-01')
    checkout_booked_date=models.DateField(max_length=20, help_text='yy-mm-dd e.g. 2014-02-01')

对于ID为1的酒店房间,日历中的日期为

checkedin_booked_date= 2016-06-01   
checkedout_booked_date 2016-06-14

您还可以查看附件以查看我的数据库的外观。 enter image description here

问题

在我的数据库外壳中,我运行了下面的代码,我得到的是“可用日期”,而不是“已预订”,因为日期仍然在范围内。

>>> import datetime
>>> start_date= datetime.date(2016, 6, 1)
>>> end_date= datetime.date(2016, 6, 5)
>>> check_for_bookings=HotelCalendar.objects.filter(Q(checkin_booked_date__gte=start_date), Q(checkout_booked_date__lte=end_date), hotelrooms_id=1)
>>> if check_for_bookings:
...     print 'booked already'
... else:
...     print 'available'
...
   available
>>>

知道遗失了什么?

更新

我尝试了下面的解决方案但未能确认6月2日和6月13日的日期已经预订了酒店房间ID 1.它返回可用而不是不可用。

>>> start_date='2016-06-02'
>>> end_date='2016-06-13'
>>> check_for_bookings=HotelCalendar.objects.filter(Q(checkin_booked_date__gte=start_date) | Q(checkout_booked_date__lte=end_date), hotelrooms_id=1)
>>> if check_for_bookings:
...     print 'not available'
... else:
 ...     print 'available'
 ...
 available
 >>>

另一件事是在我更改了结束和开始日期并运行查询之后,它起作用了。它显示房间不可用。

>>> start_date='2016-06-03'
>>> end_date='2016-06-14'
>>> check_for_bookings=HotelCalendar.objects.filter(Q(checkin_booked_date__gte=start_date)|Q(checkout_booked_date__lte=end_date), hotelrooms_id=1)
>>> if check_for_bookings:
...     print 'not available'
... else:
...     print 'available'
...
not available

这可能是个错误吗?

2 个答案:

答案 0 :(得分:0)

更改此

check_for_bookings=HotelCalendar.objects.filter(Q(checkin_booked_date__gte=start_date), Q(checkout_booked_date__lte=end_date), hotelrooms_id=1)

check_for_bookings=HotelCalendar.objects.filter(Q(checkin_booked_date__gte=start_date) | Q(checkout_booked_date__lte=end_date), hotelrooms_id=1)

<强>更新 检查此更新上方的查询,我已将&替换为|,逻辑如下。

用户,尝试查找可用性,然后输入他想要的日期(根据您的示例)2016/06/01 to 2016/06/05,这样您就必须查看从2016/06/01开始的所有预订以及预订2016/06/05。因此,利用Q|运算符,您可以查看从签入日期到结帐日期的可用性。

答案 1 :(得分:0)

您可以使用日期范围

start_date = "2011-01-01"
final_date = "2011-01-31"
check_for_bookings=HotelCalendar.objects.filter(checkin_booked_date__range=[start_date, final_date], hotelrooms_id=1)

日期也可以是上述格式的日期对象或字符串