2016-07-15 132 views
1

我有(这只是一个例子)模式这样的:Django的汇聚/注释

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

+0

你需要用'dict' 'team_ids'作为键和'player'对象(或ID?)的列表作为值i那是正确的? – Todor

+0

我需要字典与团队名称值和列表球员分配给每个球队的名字是确切的:) – hebius

回答

1

这里是你可以做什么:

  1. 你有TeamPlayer之间的M2M关系,创建它。

    class Player(models.Model): 
        name = models.CharField(...) 
    
        teams = models.ManyToManyField(Team, through='TeamHasPlayer') 
    
  2. 让您Team查询集并使用反向关系prefetchteam.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()) 
    
+0

太棒了!直到现在,我试图避免ManyToMany的关系,因为它看起来很复杂。现在我读了更多关于它,谢谢很多Todor :) – hebius

0

我会这样做,这是更具可读性和可维护性。

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