我想查看已預訂日期的日曆,以便用戶無法預訂房間,如果它已被預訂。我使用了lte和gte來檢查日期,我對目前的結果並不滿意。Django lte&gte在檢查日期範圍時失敗
型號:
class HotelCalendar(models.Model):
user=models.ForeignKey(User)
hotelrooms=models.ForeignKey(HotelRooms)
checkin_booked_date=models.DateField(max_length=20, help_text='yy-mm-dd e.g. 2014-02-01')
checkout_booked_date=models.DateField(max_length=20, help_text='yy-mm-dd e.g. 2014-02-01')
有關的空房ID爲1,在日曆日期,
checkedin_booked_date= 2016-06-01
checkedout_booked_date 2016-06-14
的問題
在我的分貝的外殼,我跑到下面的代碼和我得到「可用日期」而不是「已預訂」,因爲日期仍在範圍內。
>>> import datetime
>>> start_date= datetime.date(2016, 6, 1)
>>> end_date= datetime.date(2016, 6, 5)
>>> 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 'booked already'
... else:
... print 'available'
...
available
>>>
任何想法缺少什麼?
UPDATE:
我試圖解決以下,但未能證實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
>>>
另一件事是我改變了結束和開始日期並運行查詢,它的工作。它顯示房間不可用。
>>> 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
難道這是一個錯誤?
你不需要邏輯或邏輯,即'Q(...)| Q(...)'? – nigel222
從django文檔到[Q-objects](https://docs.djangoproject.com/en/1。9/topics/db/queries /#complex-lookups-with-q-objects): 如果提供了一個Q對象,它必須先於任何關鍵字參數的定義。 –
還沒有得到具體的解釋。 – YoYo