我希望用户能够在日历中查看已预订的日期,这样如果房间已被预订,则用户将无法预订房间。我使用 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
问题是,当日期已预订时,为什么第一个查询未能返回“不可用”。?
我还可以运行哪些其他查询来提高效率?
最佳答案
您的条件已交换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
>>>
关于python - 在 Django 中交叉检查日期时,lte 和 gte 查询不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37885729/