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()
如何获取列表中所有房间的状态。 所有房间的状态均为:
我自己试图这样做:
的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条件?
提前谢谢大家
答案 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