2016-06-17 63 views
1

我希望用戶能夠檢查已預訂日期的日曆,以便該人如果已經預訂了,則無法預訂房間。我用lte和gte來檢查日期,但它非常不一致。在Django中對日期進行Crosschecking時,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 

問題是爲什麼第一個查詢在預訂日期時未能返回「不可用」。

我可以運行哪些其他查詢以使其有效?

回答

2

已將條件換換gte <> lte。第二個查詢起作用,因爲的匹配日期爲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" 

更新:

我調整這樣說:我改變了「過濾器'到'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 
>>> 
+0

感謝您的答覆bro ..它的工作,但是當我設置start_date ='2016-06-14'和end_date ='2016-06-19',我得到'可用'。我認爲它應該是'不可用',因爲'start_date ='2016-06-14'已經在日曆中保存爲hotelout的checkout_date。您怎麼看? – YoYo

+0

即使對於hotelroom_id 3,當我選擇start_date ='2016-06-02',end_date ='2016-06-10'我就可以預訂,而且不應該這樣。你怎麼看? – YoYo

+0

哎呀,我覺得這會打破重疊。我已添加更新 –

相關問題