使用 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模型...

related_name

你需要的是ForeignKey中的related_name论点。它的工作原理如下:

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

您也可以使用aggregateAvg,但以上可能没问题。

最新更新