在Django视图中查询内部的过滤器查询

问题描述 投票:0回答:2

[我正在酒店预订应用程序上工作,在该应用程序中,我有一个“ RoomType”模型,其中包含每天可用房间数的字段...

我创建了一个用于保存BookedDates(从,到)的新模型,其中Roomie模型使用ForiegnKey ...

每次用户预订房间(从,到)时,系统都会发送一个信号,将RoomType模型保存在其中的ManyToManyField中...

现在,最终用户将在特定日期(从,到)搜索可用的房间

因此,我创建了一个查询,以过滤在该日期可用的房间,并检查它是否在特定日期保留的次数超过每天numberOfAvailableRoom的次数。

[我的问题是当我进行查询以过滤RoomType时,我通过.exclude()查询了BookedDates模型,其中每天的numberOfAvailableRoom字段小于该日期特定房间的预定时间。 ..但实际上,此结果不包括在BookedDates模型中预订的任何roomType!

models.py

class BookedDates(models.Model):
    hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE, null=True)
    room_type = models.ForeignKey(
        'RoomType', on_delete=models.CASCADE, null=True)
    booked_from = models.DateField(null=True)
    booked_to = models.DateField(null=True)

    def __str__(self):
        return '{} /\ {} /\ {}'.format(self.room_type, self.hotel, self.booked_from)


class RoomType(models.Model):
    hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE)
    room_type = models.ForeignKey(RoomTypesNames, on_delete=models.CASCADE)
    bookedDates = models.ManyToManyField(
        BookedDates)
    number_of_rooms = models.PositiveIntegerField()

views.py

            roomsByDate = RoomType.objects.annotate(modulo=numAdult % F('room_capacity')).filter(
                q_city, q_room_capacity1, modulo=0
            ).exclude(number_of_rooms__lte = BookedDates.objects.filter(room_type=F('room_type'), 
              booked_from__in = day).count())  ## my error is that the exclude , excludes any room type in the BookedDates model, even if it is reserved in this date number of times less than number_of_rooms available per day

欢迎使用其他以正确方式创建此查询的方法提前感谢

python django
2个回答
1
投票

我相信您只需要另一个注释即可计算该房间的预订数量。您可以使用反向外键路径/ related_name,在这种情况下,我认为是roomtype_set

roomsByDate = RoomType.objects.annotate(
    modulo=numAdult % F('room_capacity')
).filter(
    q_city, q_room_capacity1, modulo=0
).annotate(
    times_booked=Count("roomtype_set__id", filter=Q(booked_from__in=day), distinct=True)
).exclude(
    number_of_rooms__lte=F('times_booked')
)

0
投票

感谢 @schillingt

更新他的答案,实际上,当我按related_name搜索模型时,无论该模型中的date_from查询如何,查询都会过滤它在其他BookedDates模型中的存在时间...所以,我通过ManyToManyField本身进行了查询,仅计算thay bookedDates字段的时间

roomsByDate = RoomType.objects.annotate(
    modulo=numAdult % F('room_capacity')
).filter(
    q_city, q_room_capacity1, modulo=0
).annotate(
    times_booked=Count("bookedDates ", filter=Q(booked_from__in=day), distinct=True)
).exclude(
    number_of_rooms__lte=F('times_booked')
)
© www.soinside.com 2019 - 2024. All rights reserved.