我想检查已预订日期的日历,以便用户无法预订房间(如果已预订)。我用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
问题
在我的数据库外壳中,我运行了下面的代码,我得到的是“可用日期”,而不是“已预订”,因为日期仍然在范围内。
>>> 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
这可能是个错误吗?
答案 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)
日期也可以是上述格式的日期对象或字符串