我应该在Django模型中使用保存更新的`property`或不可编辑的字段吗?

时间:2015-02-18 21:19:38

标签: django django-models

我在做篮球联赛管理网站时正在学习Django,而且我不确定如何根据其他统计数据来处理存储统计数据。

例如,场地目标百分比,即场地目标制定/场地目标尝试。从我收集到的内容中,有三种方法可以“存储”模型:

1)作为不可编辑的字段,在保存

时计算和更新
 fg_perc = models.FloatField(default=0, editable=False)

 def save(self, *args, **kwargs):
    self.fg_perc = round(self.fgm / self.fga, 3) * 100
    super(PlayerBoxscore, self).save(*args, **kwargs)

2)作为一个功能

def fg_perc(self):
    if self.fga == 0:
        return "-"
    else:
        return round(self.fgm / self.fga, 3) * 100

3)作为财产

def _fg_perc(self):
    if self.fga == 0:
        return "-"
    else:
        return round(self.fgm / self.fga, 3) * 100

fg_perc = property(_fg_perc)

基本上我要问的是哪一个是“最好的”。

我在想的是,这些数据不会经常变化,并且会经常查看,因此第一个选项会是最好的,因为每次都不会计算数据(就像其他两个例子一样) )。但我看到人们建议使用property,所以我不确定。

最近,2)和3)有什么区别?

谢谢, 帕维尔

2 个答案:

答案 0 :(得分:0)

如果您打算在查询中使用此数据(例如订购),请使用第一个选项。 Python函数在数据库级别不可用。

如果此数据仅用于显示目的,那么属性选项就可以了。这种计算非常便宜,因此没有任何性能问题。顺便说一下,你把它简化为:

@property
def fg_perc(self):
    return round(self.fgm / self.fga, 3) * 100 if self.fga else "-"

答案 1 :(得分:0)

对于那些寻找答案的人,我想我在Djangos @cached_property找到了解决方案。

Source

Docs