我希望用户能够查看已预订日期的日历,以便该人在预订房间时将无法预订房间。我使用lte和gte来检查日期,但它非常不一致。
查看我的数据库在下面的内容。
我面临的主要问题,
从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
>>>
我从6月3日到6月14日选择了并使用以下查询对其进行了测试,结果正常。它显示房间不可用。
>>> 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 :(得分:2)
您的条件已被换gte <> lte
。第二个查询有效,因为'2016-06-14'
的匹配日期为hotelrooms_id=1
。
但您想检查start_date
和end_date
是否在checkin_booked_date
到checkout_booked_date
范围内:
check_for_bookings = HotelCalendar.objects.filter(checkin_booked_date__lte=start_date,
checkout_booked_date__gte=end_date,
hotelrooms_id=1)
如果您只需要检查而不是获取对象,请使用exists
:
if HotelCalendar.objects.filter(checkin_booked_date__lte=start_date,
checkout_booked_date__gte=end_date,
hotelrooms_id=1).exists():
<强>更新强>
从这个SO answer,我们可以判断开始日期和结束日期是否与客户的入住日期重叠:
from datetime import datetime as dt
hotelcalendar = HotelCalendar.objects.filter(hotelrooms_id=1)
start_date = dt.strptime(start_date, '%Y-%m-%d')
end_date = dt.strptime(end_date, '%Y-%m-%d')
if hotelcalendar.checkin_booked_date <= end_date and hotelcalendar.checkout_booked_date >= start_date:
print "not available"
else:
print "available"
更新:
我用这种方式调整它:我将'filter'改为'get',因为它会返回'AttributeError'。我直接使用了datetime.date()
。它到目前为止工作正常!
>>> import datetime
>>> hotelcalendar= HotelCalendar.objects.get(hotelrooms_id=1)
>>> start_date= datetime.date(2016, 06, 14)
>>> end_date= datetime.date(2016, 06, 19)
>>> if hotelcalendar.checkin_booked_date <= end_date and hotelcalendar.checkout_booked_date >= start_date:
... print 'not available'
... else:
... print 'available'
...
not available
>>> hotelcalendar= HotelCalendar.objects.get(hotelrooms_id=1)
>>> start_date= datetime.date(2016, 06, 15)
>>> end_date= datetime.date(2016, 06, 19)
>>> if hotelcalendar.checkin_booked_date <= end_date and hotelcalendar.checkout_booked_date >= start_date:
... print 'not available'
... else:
... print 'available'
...
available
>>> hotelcalendar= HotelCalendar.objects.get(hotelrooms_id=3)
>>> start_date= datetime.date(2016, 06, 02)
>>> end_date= datetime.date(2016, 06, 10)
>>> if hotelcalendar.checkin_booked_date <= end_date and hotelcalendar.checkout_booked_date >= start_date:
... print 'not available'
... else:
... print 'available'
...
not available
>>>