Django最佳实践:在哪里放置聚合方法

时间:2016-02-23 10:32:12

标签: django django-models python-3.5 django-managers

我有一个最佳实践问题:

我有一个模型Score,它包含一个值和另一个模型的ForeignKey。我的目标是调用account.scores.total_score(),它将返回帐户中所有分数的总和。

class Score(models.Model):
    value = models.IntegerField()
    account = models.ForeignKey(Account, related_name='scores')

我正考虑写一个ScoreManagerScoreQuerySet来轻松处理此访问。

class ScoreQuerySet(models.QuerySet):
    def total_score(self):
        return self.aggregate(Sum('value'))

class ScoreManager(models.Manager):
    use_for_related_fields = True

    def get_queryset(self):
        return ScoreQuerySet(self.model, using=self._db)

class Score(models.Model):
    value = models.IntegerField()
    account = models.ForeignKey(Account, related_name='scores')
    objects = ScoreManager()

这仅在我致电account.scores.all().total_score()但不能直接与account.scores.total_score()通话时有效。这不起作用,因为不知何故我的模型没有在关系上注册新的Manager和QuerySet。但也许这不是最好的做法,所以我不需要花时间来解决这个问题,而应该选择另一种方式。 那么你们对此有何看法?我应该在total_score()模型中创建Account函数吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如果您始终需要计算与帐户关联的总分,为什么不将其作为方法添加到您的帐户模型中?

类帐户(models.Model):     ...

def get_total_score(self):
    return self.scores.aggregate(Sum('value'))

# or even as a property:
@property
def total_score(self):
   return self.scores.aggregate(Sum('value'))