获取模型的所有对象的状态

时间:2017-12-22 14:13:41

标签: python django

models.py

class Room(models.Model):
    # Default all rooms are Free
    number = models.ForeignKey(RoomNumber)

class Reserved(models.Model):
    visitor = models.ForeignKey(Visitor, on_delete=models.PROTECT)
    room = models.OneToOneField(Room)
    reserved_date = models.DateTimeField()
    begin_date = models.DateTimeField()
    end_date = models.DateTimeField()

如何获取列表中所有房间的状态。 所有房间的状态均为:

  1. 保留
  2. 免费房间
  3. 忙房
  4. 我自己试图这样做:

    的ListView

    reserved = Reserved.objects\
        .filter(room=OuterRef('pk'))\
        .filter(begin_date=timezone.now())\
        .values(count=Count('pk'))
    
    Room.objects.annotate(reserved=Subquery(reserved[:1]))
    

    但没有结果:( 以及如何获取房间的模板状态? 通过if else条件?

    提前谢谢大家

1 个答案:

答案 0 :(得分:0)

我对你的问题做了一点点工作,而且有点复杂。

首先

您应该使用models.ForeignKey(Room)代替OneToOneField(Room)

class Reservation(models.Model):
    room = models.ForeignKey(Room, on_delete=models.PROTECT)

OneToOneField表示每个'房间'实例在系统中只能有一个预留,但实际上它可以有很多(未来计划)。此外,我不认为有必要将房间号作为一个单独的模型,这就是为什么我把它重写为接受3个字符的简单charfield。

其次

您需要为 预订表单 构建 验证 ,以防止人们在预订时保留空间有人已经保留了它(我现在没有时间写它,但你可以使用下面的查询集自己编写。我会稍后再尝试)

最重要的是

我的解决方案基于简单的想法:

&#34;如果您能找到所选房间的预订房间,您就知道哪些房间是免费的<&34;

检查哪些房间很忙很容易:

begin_date&lt; = my_date &lt; = end_date

这就是为什么我只建造模型管理器,它返回为指定日期保留的房间。

from django.db.models import Q
import datetime


class ReservedManager(models.Manager):
    def ondate(self, my_date):
        query = Reservation.instances.filter(
            Q(begin_date__lte=my_date),
            Q(end_date__gte=my_date)
            )
        return query

# Create your models here.
class Room(models.Model):
    # Default all rooms are Free
    number = models.CharField(max_length=3, null=False, blank=False)

    def __str__(self):
        return(str(self.number))



class Reservation(models.Model):
    room = models.ForeignKey(Room, on_delete=models.PROTECT)
    reserved_date = models.DateTimeField(auto_now_add=True)
    begin_date = models.DateField()
    end_date = models.DateField()
    instances = models.Manager()
    reserved = ReservedManager()

    def __str__(self):
        return(str(self.room)+' from '+str(self.begin_date)+' to '+str(self.end_date))

您可以轻松访问信息:

choosen_date = datetime.date(2017, 12, 23)
queryset = Reservation.reserved.ondate(choosen_date)

此时您可以访问预订实例的房间,但是您喜欢:

queryset[1].room