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

标签 python django django-models django-views

我希望用户能够在日历中查看已预订的日期,这样如果房间已被预订,则用户将无法预订房间。我使用 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/

相关文章:

python - Django 模型、添加新值(value)、迁移

python - 如何在悬停文本 Plotly 中打破长行?

python - 如何从python中的字符串中删除小写单词

python - 使用字符串django自动递增id值

python - 自定义/删除 Django 选择框空白选项

django模型关系如何将模型A两次链接到模型B

python - python中从列表中查找具有特定属性值的对象的最快方法?

python - 如何在 Pytorch 中反转 bool 值张量?

python - Django 事务管理 block 以未决的 COMMIT/ROLLBACK 结束

python - 自定义管理器并不总是为多对一关系添加计算字段