[英]Django Filter by date and status
我在這里的第一個問題,我一直在環顧四周,但找不到解決方案。
我正在建立一個預訂系統,我的模型是
class Room(models.Model):
number = models.IntegerField()
beds = models.IntegerField()
capacity = models.IntegerField()
category = models.ForeignKey(
RoomCategory, on_delete=models.CASCADE, blank=True, null=True)
class Booking(models.Model):
room = models.ForeignKey(Room, on_delete=models.CASCADE, blank=True, null=True)
check_in = models.DateField()
check_out = models.DateField()
status = models.IntegerField(blank=True, null=True)
if request.method == 'POST':
no_disponible = "No hay habitaciones disponibles, selecciona otras fechas"
if form.is_valid():
room_list = Room.objects.filter(category=1).exclude(booking__check_in__lt=form.cleaned_data['check_out'],
booking__check_out__gt=form.cleaned_data['check_in'], booking__status__gt=0)
當客戶確認時我正在更改狀態,所以我想檢查當狀態不是 1 時日期是否可用(一旦付款獲得批准,我將狀態更改為 1。但是,booking__status__gt=0 似乎在這里不起作用
根據您的查詢,您希望排除以下房間:
您當前的查詢是:
Room.objects.filter(category=1).exclude(
booking__check_in__lt=form.cleaned_data['check_out'],
booking__check_out__gt=form.cleaned_data['check_in'],
booking__status__gt=0,
)
這將刪除狀態大於 0 的所有房間,以及入住/退房日期無效的房間,即使其中一些入住/退房日期無效的房間的狀態為 0。這是因為exclude
在跨越時的工作原理像這樣的多值關系。
要解決此問題,請更改您的查詢以使用Booking
獲取具有所需排除項的所有Booking
,然后將其與反向關系進行比較:
Room.objects.filter(category=1).exclude(
booking__in=Booking.objects.filter(
check_in__lt=form.cleaned_data['check_out'],
check_out__gt=form.cleaned_data['check_in'],
status__gt=0,
)
)
閱讀此處以了解更多在這種情況下exclude
的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.