从两个模型中获取列表(带有附加字段)。制作子查询

时间:2017-12-20 14:50:43

标签: python django

我有预留和房间模型(默认状态为免费)。我想得到所有房间的清单。

他们的状态是

  1. 保留(我有这样的表)
  2. 免费(不是价格,州)
  3. 所以简而言之,我需要让所有房间都有自己的状态。我不需要状态字段,也不会添加它。我的模型中没有状态字段。我怎样才能获得某些状态?

    简短型号

    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 房间

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)