2016-07-15 96 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)