[我正在酒店预订应用程序上工作,在该应用程序中,我有一个“ 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
欢迎使用其他以正确方式创建此查询的方法提前感谢
我相信您只需要另一个注释即可计算该房间的预订数量。您可以使用反向外键路径/ 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')
)
感谢 @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')
)