python - 使用 ForeignKey 在 Django 中定义属性方法
问题描述
我正在使用我的 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
您需要的related_name
是ForeignKey
. 它的工作原理如下:
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
and来执行此操作Avg
,但上面可能没问题。
推荐阅读
- api - 如何使用 Stripe ConfirmCardPayment 的元素列表
- r - 比较大小不等的向量之间的值,以找到彼此相距一定距离内的值(没有循环?)
- python - 使用生成器理解创建数据框
- algorithm - 如何找到 KthLargest 算法的平均情况?
- python - 从 Pandas 中的现有 df 创建新的 df - python
- html - Css动画:过渡不反向工作
- python - 嵌套 for 循环将非结构化数据转换为结构化数据
- abap - 创建 CDS 实体时不允许使用关键字 ENTITY
- php - 检查一个数组中的任何项是否包含在另一个数组中的任何项中
- excel - 返回基于多个标准的记录,包括军事格式的时间