我有一个最佳实践问题:
我有一个模型Score
,它包含一个值和另一个模型的ForeignKey。我的目标是调用account.scores.total_score()
,它将返回帐户中所有分数的总和。
class Score(models.Model):
value = models.IntegerField()
account = models.ForeignKey(Account, related_name='scores')
我正考虑写一个ScoreManager
和ScoreQuerySet
来轻松处理此访问。
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
函数吗?
感谢您的帮助!
答案 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'))