我有预留和房间模型(默认状态为免费)。我想得到所有房间的清单。
他们的状态是
所以简而言之,我需要让所有房间都有自己的状态。我不需要状态字段,也不会添加它。我的模型中没有状态字段。我怎样才能获得某些状态?
简短型号
class Room(models.Model):
# Default all rooms are Free (Rooms state)
number = models.ForeignKey(RoomNumber)
expiry_date = models.DateTimeField()
class Reserved(models.Model):
visitor = models.ForeignKey(Visitor, on_delete=models.PROTECT)
room = models.OneToOneField(Room)
reserved_date = models.DateTimeField()
begin_date = models.DateTimeField()
我尝试做Subquery但没有结果:(
reserved = Reserved.objects\
.filter(room=OuterRef('pk'))\
.filter(begin_date=timezone.now())\
.values(count=Count('pk'))
Room.objects.annotate(reserved=Subquery(reserved[:1]))
如果 0 空
,则保留 1 房间答案 0 :(得分:1)
从头到尾,所以语法可能不准确。
Room.objects.filter(Q(reserved__isnull=False), Q(expiry_date__gt=datetime.date.today()) | Q(reserved_begin_date__lt=datetime.date.today()))
但我发现你的模型很复杂,也有问题。如果一个房间目前被预订,你会怎么做,但第二个访客想要保留下个月的房间?以1-1的关系,这是不可能的。
为什么不呢?
class Room(models.Model):
number = models.ForeignKey(RoomNumber)
class Reservation(models.Model):
visitor = models.ForeignKey(Visitor, on_delete=models.PROTECT)
room = models.ForeignKey(Room, on_delete=...)
reserved_date = models.DateTimeField()
begin_date = models.DateTimeField()
end_date = models.DateTimeField()
你可以
given_date = datetime.date.today()
free_rooms_on_given_date = Room.objects.exclude(begin_date__lt=given_date).exclude(end_date__gt=given_date)