lte&在Django

时间:2016-06-17 15:53:26

标签: 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

问题是,为什么第一个查询在预订日期时未能返回“不可用”。

我可以运行哪些其他查询来提高效率?

1 个答案:

答案 0 :(得分:2)

您的条件已被换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
>>>