简体   繁体   English

如何在 django 模型中创建一个方法,该方法返回同一 model 中字段的总和?

[英]How do I create a method in django models that returns the sum of a field in that same model?

I'm new to Django and I have two models set up like this currently.我是 Django 的新手,目前我有两个这样的模型。 I want to calculate, in the Climber model, that returns the total points that climber has earned by accessing the climbs_completed field.我想在Climber model 中计算,返回登山者通过访问climbs_completed字段获得的总积分。 How can I go about doing this?我怎么能 go 关于这样做? In other words, how do I sum up the points for each Climb in climbs_completed ?换句话说,我如何总结每个Climb中的points climbs_completed Is there a better way to do this besides writing a method?除了编写方法之外,还有更好的方法吗? Thank you in advance!先感谢您!

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

You can use Sum and add the total climb points as annotated value like this:您可以使用Sum并将总爬升点添加为注释值,如下所示:

from django.db.models import Sum

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

Or you can use aggregation in the total_score method, like this:或者您可以在total_score方法中使用聚合,如下所示:

class Climber(models.Model):
    ...

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

First method is more efficient if you want to get values from bunch of climbers and do it in one database hit.如果您想从一群登山者那里获取值并在一个数据库中完成,第一种方法更有效。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM