所以我试图获得所有游戏中与相应玩家相关的每个分数的总和以及他玩了多少游戏
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"
}
我认为我可以获得我的玩家的价值清单然后查看所有游戏的总和并计算列表中每个值所玩的游戏,但我不知道该怎么做。
我知道如何为特定播放器执行此操作,但我希望获得整个列表。我认为这是一个循环,每个玩家都可以自己计算。
由于
答案 0 :(得分:3)
您的models.py
似乎不完整,所以我假设Player
和Game
之间存在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()
}