Django聚合/注释

时间:2016-07-15 16:40:11

标签: django django-models annotations aggregation

我有(这只是一个例子)这样的模型:

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注释/聚合工具来实现,我阅读了所有关于它的文档,尝试了许多不同的方法,但我无法实现我想要的。任何人都可以给我任何提示吗?我不想做任何ask-db-in-for-loop的事情所以我决定使用聚合/注释。

2 个答案:

答案 0 :(得分:1)

以下是您可以做的事情:

  1. 您在TeamPlayer之间建立了M2M关系,并创建它。

    class Player(models.Model):
        name = models.CharField(...)
    
        teams = models.ManyToManyField(Team, through='TeamHasPlayer')
    
  2. 获取Team个查询集并使用反向关系prefetch team.players

    teams = Team.objects.all().prefetch_related('player_set')
    
  3. 现在创建你的团队字典:

    team_dict = {}
    for team in teams:
        team_dict[team.name] = list(team.player_set.all())
    

答案 1 :(得分:0)

我会以这种方式做到这一点,它更具可读性和可维护性。

dic_ = {}
for team in Team.objects.all():
    dic_[team.name] = team.teamhasplayer_set.values_list('player', flat=True)