簡體   English   中英

Django 按日期和狀態過濾

[英]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 似乎在這里不起作用

根據您的查詢,您希望排除以下房間:

  1. 登記入住少於要求退房的預訂。
  2. 退房次數多於要求的入住次數的預訂。
  3. 狀態大於 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM