Django - 对于每个对象,属于相同FK的Sum相关字段

时间:2018-03-22 01:24:31

标签: django django-rest-framework

所以我试图获得所有游戏中与相应玩家相关的每个分数的总和以及他玩了多少游戏

class Player(models.Model):
     name = models.CharField()

class Game(models.Model):
     points = models.IntegerField()
     user = models.ForeignKey(User, on_delete=models.CASCADE)

我想要的输出是:

{
    "name": "asdf",
    "total_points": "9999"
    "games_played": "12"
}

我认为我可以获得我的玩家的价值清单然后查看所有游戏的总和并计算列表中每个值所玩的游戏,但我不知道该怎么做。

我知道如何为特定播放器执行此操作,但我希望获得整个列表。我认为这是一个循环,每个玩家都可以自己计算。

由于

2 个答案:

答案 0 :(得分:3)

您的models.py似乎不完整,所以我假设PlayerGame之间存在FK关系,如下所示

class Player(models.Model):
    name = models.CharField(max_length=200)


class Game(models.Model):
    points = models.IntegerField()
    user = models.ForeignKey(Player, on_delete=models.CASCADE)


您可以使用Group By查询获取数据库的所有摘要,如下所示,

from django.db.models import Count, Sum, F

Game.objects.annotate(name=F('user__name')).values('name').annotate(games_played=Count('id'), total_points=Sum('points'))



样本输出将是这样的,

 <QuerySet [{'name': 'name_1', 'games_played': 2, 'total_points': 6}, {'name': 'name_2', 'games_played': 1, 'total_points': 2}]>


QuerySet是一个类似于list的迭代。如果需要,您可以迭代它。因此,QuerySet中的每个项目都是这样的,

{'name': 'name_1', 'games_played': 2, 'total_points': 6}

答案 1 :(得分:2)

假设Player User存储为.user,您可以执行以下操作:

from django.db.models import Sum

games = Game.objects.filter(user=player.user)
output = {
    'name': player.name,
    'total_points': games.aggregate(Sum('points')),
    'total_games': games.count()
}