姜戈 aggregation/annotation
Django aggregation/annotation
我有(这只是一个例子)这样的模型:
class Team(models.Model):
name = models.CharField(...)
class Player(models.Model):
name = models.CharField(...)
TeamHasPlayer(models.Model):
team = models.ForeignKey(Team)
player = models.ForeignKey(Player)
我需要制作这样的字典:
{
'Team_1': [Player_1, Player_2, ...],
'Team_2': [Player_3, Player_4, ...],
...
}
我认为它可以通过 django annotation/aggregation 工具来实现,我阅读了所有关于它的文档,尝试了很多不同的方法,但我无法实现我想要的。谁能给我任何提示?我不想做任何 asking-db-in-for-loop 的事情所以我决定使用 aggregations/annotations.
我会这样做,更易读和可维护。
dic_ = {}
for team in Team.objects.all():
dic_[team.name] = team.teamhasplayer_set.values_list('player', flat=True)
您可以执行以下操作:
您在 Team
和 Player
之间建立了 M2M 关系,创建它。
class Player(models.Model):
name = models.CharField(...)
teams = models.ManyToManyField(Team, through='TeamHasPlayer')
获取您的 Team
查询集并使用反向关系 prefetch
team.players
teams = Team.objects.all().prefetch_related('player_set')
现在创建你的团队指令:
team_dict = {}
for team in teams:
team_dict[team.name] = list(team.player_set.all())
我有(这只是一个例子)这样的模型:
class Team(models.Model):
name = models.CharField(...)
class Player(models.Model):
name = models.CharField(...)
TeamHasPlayer(models.Model):
team = models.ForeignKey(Team)
player = models.ForeignKey(Player)
我需要制作这样的字典:
{
'Team_1': [Player_1, Player_2, ...],
'Team_2': [Player_3, Player_4, ...],
...
}
我认为它可以通过 django annotation/aggregation 工具来实现,我阅读了所有关于它的文档,尝试了很多不同的方法,但我无法实现我想要的。谁能给我任何提示?我不想做任何 asking-db-in-for-loop 的事情所以我决定使用 aggregations/annotations.
我会这样做,更易读和可维护。
dic_ = {}
for team in Team.objects.all():
dic_[team.name] = team.teamhasplayer_set.values_list('player', flat=True)
您可以执行以下操作:
您在
Team
和Player
之间建立了 M2M 关系,创建它。class Player(models.Model): name = models.CharField(...) teams = models.ManyToManyField(Team, through='TeamHasPlayer')
获取您的
Team
查询集并使用反向关系prefetch
team.players
teams = Team.objects.all().prefetch_related('player_set')
现在创建你的团队指令:
team_dict = {} for team in teams: team_dict[team.name] = list(team.player_set.all())