Django最佳实践:在何处放置聚合方法
我有一个最佳实践问题: 我有一个modelDjango最佳实践:在何处放置聚合方法,django,django-models,python-3.5,django-managers,Django,Django Models,Python 3.5,Django Managers,我有一个最佳实践问题: 我有一个modelScore,其中包含一个值和另一个model的外键。我的目标是使调用account.scores.total_score()成为可能,它将返回帐户中所有分数的值之和 class Score(models.Model): value = models.IntegerField() account = models.ForeignKey(Account, related_name='scores') 我正在考虑编写一个ScoreManage
Score
,其中包含一个值和另一个model的外键。我的目标是使调用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()
。这不起作用,因为我的模型没有注册新经理,也没有在关系上设置查询。但也许这不是最好的做法,所以我不需要花时间来解决这个问题,应该选择另一种方式。
你们怎么看?我是否应该在帐户
模型中创建一个total_score()
函数
谢谢你的帮助 如果您总是需要计算与帐户相关联的总分,为什么不将其作为一种方法添加到您的帐户模型中 类别帐户(models.Model):
我也在考虑这个问题,但是如果使用帐户模型而不使用分数模型(它们在不同的应用程序中),那将是一个问题。啊,这是有道理的。在这种情况下,我不确定如何在外键关系上获得分数的manareg方法。我会继续用谷歌搜索。
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'))