Python Django视图中查询内部的筛选查询
我正在开发酒店预订应用程序,其中我有一个“RoomType”模型,其中包含每天可用房间数的字段 我创建了一个用于保存BookEdates(from,to)的新模型,其中ForiegnKey用于RoomType模型 每次用户预订房间(从、到),都会发送一个信号,将RoomType模型保存在其中的许多字段中 现在,最终用户将搜索特定日期(从、到)的可用房间 因此,我创建了一个查询,以筛选此日期内可用的房间,并检查其在特定日期内的保留次数是否超过每天可用eRoom的数量 我的问题是当我查询筛选RoomTypes i.exclude()时,通过它查询BookedDates模型,其中NumberOfAvailableRoomper day字段小于该日期预订的特定于时间的房间数。。。 但实际上,这样做的结果不包括BookEdates模型中预订的任何房间类型 models.pyPython Django视图中查询内部的筛选查询,python,django,Python,Django,我正在开发酒店预订应用程序,其中我有一个“RoomType”模型,其中包含每天可用房间数的字段 我创建了一个用于保存BookEdates(from,to)的新模型,其中ForiegnKey用于RoomType模型 每次用户预订房间(从、到),都会发送一个信号,将RoomType模型保存在其中的许多字段中 现在,最终用户将搜索特定日期(从、到)的可用房间 因此,我创建了一个查询,以筛选此日期内可用的房间,并检查其在特定日期内的保留次数是否超过每天可用eRoom的数量 我的问题是当我查询筛选Room
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')
)