如何一次从三个不同的表中获取信息?

时间:2019-11-07 13:58:10

标签: django django-models django-views

我有以下型号:

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中为给定设备名称设置的时间段。

3 个答案:

答案 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()