Python Django视图中查询内部的筛选查询

Python Django视图中查询内部的筛选查询,python,django,Python,Django,我正在开发酒店预订应用程序,其中我有一个“RoomType”模型,其中包含每天可用房间数的字段 我创建了一个用于保存BookEdates(from,to)的新模型,其中ForiegnKey用于RoomType模型 每次用户预订房间(从、到),都会发送一个信号,将RoomType模型保存在其中的许多字段中 现在,最终用户将搜索特定日期(从、到)的可用房间 因此,我创建了一个查询,以筛选此日期内可用的房间,并检查其在特定日期内的保留次数是否超过每天可用eRoom的数量 我的问题是当我查询筛选Room

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

我创建了一个用于保存BookEdates(from,to)的新模型,其中ForiegnKey用于RoomType模型

每次用户预订房间(从、到),都会发送一个信号,将RoomType模型保存在其中的许多字段中

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

因此,我创建了一个查询,以筛选此日期内可用的房间,并检查其在特定日期内的保留次数是否超过每天可用eRoom的数量

我的问题是当我查询筛选RoomTypes i.exclude()时,通过它查询BookedDates模型,其中NumberOfAvailableRoomper day字段小于该日期预订的特定于时间的房间数。。。 但实际上,这样做的结果不包括BookEdates模型中预订的任何房间类型

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
任何以正确方式创建此查询的其他方法都是受欢迎的
提前谢谢

我相信您只需要另一个注释来计算该房间的预订数量。您可以使用反向外键路径/相关名称,在本例中,它是
roomtype\u 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')
)

谢谢你的@schillingt

更新他的答案,实际上,当我搜索模型的相关名称时,查询会过滤它在其他BookedDates模型中的存在时间,而不管该模型中查询的日期是什么。。。 所以 我通过ManyToManyField本身进行查询,只计算bookedDates字段的次数


谢谢。。它工作得很好,为什么会这样;distinct=True?我发现有时聚合会多次计数项。偶尔不需要它,但我还没有花时间真正确定什么时候需要它。或者,当我以后对代码进行更改时,会突然出现错误,而忽略了这一点。
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')
)