首页 > 解决方案 > 如何在 django 模型中创建一个方法,该方法返回同一模型中字段的总和?

问题描述

我是 Django 新手,目前我有两个这样的模型。我想在Climber模型中计算返回登山者通过访问该climbs_completed字段获得的总积分。我该怎么做呢?换句话说,我如何总结pointsfor each Climbin climbs_completed?除了编写方法之外,还有更好的方法吗?先感谢您!

class Climb(models.Model):
    name = models.CharField(max_length=20, default='')
    grades = [('v'+str(i),'v'+str(i))for i in range(0,13)]
    grade = models.CharField(max_length=3, choices=grades, default='v-1')
    weeks = [(i,i)for i in range(1,13)]
    week = models.IntegerField(choices=weeks, default=0)
    points = models.IntegerField(default=0)

    def __str__(self):
        return self.name

class Climber(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    grades = [('v'+str(i),'v'+str(i))for i in range(0,13)]
    highest_grade = models.CharField(max_length=3, choices=grades, default='v0')
    team = models.ForeignKey(Team, null=True, on_delete=models.SET_NULL)
    climbs_completed = models.ManyToManyField(Climb, blank=True)

    def __str__(self):
        return self.user.username

    # for each climbs_completed, sum up the points
    def total_score(self):
        pass

标签: pythondjangodjango-models

解决方案


您可以使用Sum和添加总爬升点作为注释值,如下所示:

from django.db.models import Sum

climbers = Climber.objects.annotate(total_score=Sum('climbs_completed__points'))
print(climbers.values('pk', 'total_score'))

或者您可以在方法中使用聚合total_score,如下所示:

class Climber(models.Model):
    ...

    def total_score(self):
       return self.climbs_completed.aggregate(total_score=Sum('points'))['total_score']

如果您想从一群登山者那里获取值并在一个数据库中完成,第一种方法更有效。


推荐阅读