2016-06-15 33 views
0

我想查看已預訂日期的日曆,以便用戶無法預訂房間,如果它已被預訂。我使用了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 

您還可以查看附加的文件,看看我的數據庫看起來像。 enter image description here

的問題

在我的分貝的外殼,我跑到下面的代碼和我得到「可用日期」而不是「已預訂」,因爲日期仍在範圍內。

>>> 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 

難道這是一個錯誤?

+0

你不需要邏輯或邏輯,即'Q(...)| Q(...)'? – nigel222

+0

從django文檔到[Q-objects](https://docs.djangoproject.com/en/1。9/topics/db/queries /#complex-lookups-with-q-objects): 如果提供了一個Q對象,它必須先於任何關鍵字參數的定義。 –

+0

還沒有得到具體的解釋。 – YoYo

回答

0

更改此

check_for_bookings=HotelCalendar.objects.filter(Q(checkin_booked_date__gte=start_date), Q(checkout_booked_date__lte=end_date), hotelrooms_id=1) 

check_for_bookings=HotelCalendar.objects.filter(Q(checkin_booked_date__gte=start_date) | Q(checkout_booked_date__lte=end_date), hotelrooms_id=1) 

更新: 選中此更新上面的查詢,我已經取代&|,邏輯是如下。

的用戶,試圖尋找可用性,他進入了他想要的日期可以說(根據您的例子)2016/06/01 to 2016/06/05所以你要查找的2016/06/01與預訂高達2016/06/05沿啓動所有預訂。因此,利用Q|運營商,您將能夠找到從入住日期到結帳日期的可用性。

+0

仍然可用,而不是已經預訂。 – YoYo

+0

@YoYo我更新了我的查詢,你可以嘗試運行它嗎? –

+0

@Yoyo你能分享你的數據庫中的一些示例數據嗎? –

0

您可以使用日期範圍

start_date = "2011-01-01" 
final_date = "2011-01-31" 
check_for_bookings=HotelCalendar.objects.filter(checkin_booked_date__range=[start_date, final_date], hotelrooms_id=1) 

日期也可以是日期對象或字符串在上面的格式

+0

無效。 – YoYo

+0

@YYYo你會得到「2011-01-01」到「2011-01-30」之間的對象。如果您使用的是DateField,它肯定會起作用。 –