2016-07-15 21 views
1

Ich habe (es ist nur ein Beispiel) Modelle wie diese:Django Aggregation/Anmerkung

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) 

Ich brauche ein Wörterbuch wie diese machen:

{ 
    'Team_1': [Player_1, Player_2, ...], 
    'Team_2': [Player_3, Player_4, ...], 
    ... 
} 

Ich dachte, es mit django erreicht werden kann Annotation/Aggregation-Tools, ich lese alle Dokumente darüber, habe viele verschiedene Ansätze ausprobiert, aber ich kann nicht erreichen, was ich will. Kann mir jemand einen Hinweis geben? Ich möchte keine Fragen in Bezug auf db-in-for-loop stellen, also entschied ich mich, Aggregationen/Annotationen zu verwenden.

+0

Sie benötigen einen 'dict' mit mit 'team_ids' als Schlüssel und einer Liste von' player' Objekten (oder ids?) als Wert i Stimmt das? – Todor

+0

Ich brauche dict mit den Namen der Teamnamen und listet die Spieler auf, die jedem Teamnamen zugeordnet sind. – hebius

Antwort

1

Hier ist, was Sie tun können:

  1. Sie haben eine M2M-Beziehung zwischen Team und Player, erstellen Sie es.

    class Player(models.Model): 
        name = models.CharField(...) 
    
        teams = models.ManyToManyField(Team, through='TeamHasPlayer') 
    
  2. Holen Sie sich Ihre Team queryset und mit der umgekehrten Beziehung prefetch die team.players

    teams = Team.objects.all().prefetch_related('player_set') 
    
  3. Jetzt Ihr Team dict erstellen:

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

Großartig! Bis jetzt habe ich versucht, ManyToMany Beziehung zu vermeiden, weil es mir kompliziert erschien. Jetzt lese ich mehr darüber, vielen Dank Todor :) – hebius

0

Ich würde dies auf diese Weise tun, die besser lesbar und wartbar ist.

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