python - 如何在 django 模型中创建一个方法,该方法返回同一模型中字段的总和?
问题描述
我是 Django 新手,目前我有两个这样的模型。我想在Climber
模型中计算返回登山者通过访问该climbs_completed
字段获得的总积分。我该怎么做呢?换句话说,我如何总结points
for each Climb
in 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
解决方案
您可以使用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']
如果您想从一群登山者那里获取值并在一个数据库中完成,第一种方法更有效。
推荐阅读
- javascript - 检查数组元素是否具有相同的大小
- javascript - 缓冲区未显示在地图上
- python-3.x - 使用pandas的melt函数转换大数据框
- python - Python 检查一个值是否大于数组/向量中的下一个值
- amazon-web-services - 无法从 AWS 中的家用计算机连接到 RDS
- javascript - 使用 puppeteer 获取标题
- anaconda - Conda 命令列出包的大小
- python - VS Code 交互式笔记本
- javascript - 反应应用程序中具有多列的引导行未在中心对齐,右侧有一些空间
- reactjs - 如何在 Reactjs 和引导表单中并排放置标签和输入字段