我正在使用我的Django应用程序,其中我有两个模型:Store
和Turn
。存在一对多关系,其中商店有许多轮次需要处理。这是代码:
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_name
django 实际上会通过以小写形式将_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
您也可以使用aggregate
和Avg
,但以上可能没问题。