我有以下型号:
class Device(models.Model):
name = models.CharField(max_length=100, blank=False)
description = models.TextField(max_length=500, blank=True)
ip_address = models.GenericIPAddressField(blank=True, null=True)
contact_person = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
team = models.ForeignKey(Team, on_delete=models.SET_NULL, null=True)
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
def __str__(self):
return self.name
class TimeSlot(models.Model):
name = models.CharField(max_length=20)
start_slot = models.CharField(max_length=10)
end_slot = models.CharField(max_length=10)
def __str__(self):
return self.name
class Reservation(models.Model):
device = models.ForeignKey(Device, on_delete=models.CASCADE)
time_slot = models.ForeignKey(TimeSlot, on_delete=models.CASCADE)
date_of_reservation = models.DateField()
user = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return "{} - {} for device: {} by {}.".format(self.time_slot, self.date_of_reservation, self.device, self.user)
class ForbiddenSlot(models.Model):
device = models.ForeignKey(Device, on_delete=models.CASCADE)
time_slot = models.ForeignKey(TimeSlot, on_delete=models.CASCADE)
def __str__(self):
return str(self.time_slot)
这是简单的预订系统。我有一个问题要了解如何为三个不同的表创建查询。 我想获取所有未在ForbiddenSlot和Reservation中为给定设备名称设置的时间段。
答案 0 :(得分:0)
我不确定这是否行得通,但我认为绝对值得一试。
TimeSlot.objects.filter(
forbiddenslot__isnull=True,
reservation__device__name='Device Name',
)
缠住我的头不一定是最容易的事情,但是TimeSlot
不仅可以访问.forbiddenslot_set
,还可以按forbiddenslot
进行过滤。 reservation
也是如此。
答案 1 :(得分:0)
我想更改模型的结构会更好,例如删除模型ForbiddenSlot
并将其替换为保留模型上的标志,然后可以从保留模型中选择所有禁止标记的时间段是False,例如:
reservations = Reservation.objects.only('time_slot').filter(device__name=name_of_the_device,forbidden=False)
,其中forbidden
是布尔字段。
答案 2 :(得分:0)
使用select_related()将预先填充适当的属性:
Model.objects.select_related()