gpt4 book ai didi

python - 在 Django 中交叉检查日期时,lte 和 gte 查询不一致

转载 作者:行者123 更新时间:2023-12-01 03:53:34 29 4
gpt4 key购买 nike

我希望用户能够在日历中查看已预订的日期,这样如果房间已被预订,则用户将无法预订房间。我使用 lte 和 gte 来检查日期,但非常不一致。

看看我的数据库如下所示。

enter image description here

我面临的主要问题,

从 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_dateend_date在范围内 checkin_booked_datecheckout_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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com