[英]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.