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

kac*_*s22 4 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)
Run Code Online (Sandbox Code Playgroud)

我想要的输出是:

{
    "name": "asdf",
    "total_points": "9999"
    "games_played": "12"
}
Run Code Online (Sandbox Code Playgroud)

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

我知道如何为特定玩家执行此操作,但我想获取整个列表。我认为这是一个循环,每个玩家都自己计数。

谢谢

JPG*_*JPG 8

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

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)
Run Code Online (Sandbox Code Playgroud)


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'))
Run Code Online (Sandbox Code Playgroud)



示例输出将是这样的,

 <QuerySet [{'name': 'name_1', 'games_played': 2, 'total_points': 6}, {'name': 'name_2', 'games_played': 1, 'total_points': 2}]>
Run Code Online (Sandbox Code Playgroud)


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

{'name': 'name_1', 'games_played': 2, 'total_points': 6}
Run Code Online (Sandbox Code Playgroud)