Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django最佳实践:在何处放置聚合方法_Django_Django Models_Python 3.5_Django Managers - Fatal编程技术网

Django最佳实践:在何处放置聚合方法

Django最佳实践:在何处放置聚合方法,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

我有一个最佳实践问题:

我有一个model
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'))