首页 > 解决方案 > 使用 ForeignKey 在 Django 中定义属性方法

问题描述

我正在使用我的 Django 应用程序,其中有两个模型:StoreTurn. 存在一对多关系,其中商店有许多需要处理的转弯。这是代码:

class Store(models.Model):
    name = models.CharField(max_length=20)
    adress = models.CharField(max_length=40)
    image = models.ImageField(upload_to=)

    @property
    def average_wait_time(self):
        return #here's the problem

    def __str__(self):
        return self.name


class Turn(models.Model):
    store = models.ForeignKey(Store, on_delete=models.SET_NULL, null=True)
    creation_time = models.TimeField(auto_now=True)
    completion_time = models.TimeField(blank=True, null=True)

    def complete(self):
        self.completion_time = timezone.now()

    def __str__(self):
        return f'Turno a las {creation_time} para el Negocio {completion_time}'

如您所见,我@property需要使用一种方法来计算商店中的平均等待时间,该时间由转弯持续时间的平均值确定。我怎样才能使这项工作?我无法Turn从“商店”模型访问模型...

标签: pythonpython-3.xdjango

解决方案


related_name

您需要的related_nameForeignKey. 它的工作原理如下:

store = models.ForeignKey(Store, on_delete=models.SET_NULL, null=True, related_name="turns")

这意味着您现在可以访问特定商店的所有回合,如下所示:

store = Store.objects.get(id=1)  # get a store
turns = store.turns

turns在上面将是一个Turn对象的查询集。

另请注意,如果您未指定related_namedjango 实际上会通过添加_set到相关模型名称的末尾以小写形式自动为您创建一个,您可以对以下内容执行相同操作:

turns = store.turn_set

但最好related_name明确命名。

您的特殊情况

class Store(models.Model):
    ...

    @property
    def average_wait_time(self):
        turns = self.turns
        total_time = sum([turn.completion_time - turn.creation_time for turn in turns.all()])
        average_time = total_time / turns.count()
        return average_time

您也可以使用aggregateand来执行此操作Avg,但上面可能没问题。


推荐阅读