mam w models.py
:scalić querysets w Django
class Game(models.Model):
players1 = models.ManyToManyField(Player, related_name='games1')
players2 = models.ManyToManyField(Player, related_name='games2')
def get_all_players(self):
return list(itertools.chain(self.players1.all(), self.players2.all()))
Jak mogę napisać tę samą metodę get_all_players
, ale powrót QuerySet
, nie list
?
P.S. Wiem, że jest | operator:
def get_all_players(self):
return self.players1.all() | self.players2.all()
Ale działa w bardzo dziwny sposób. Wynik tej funkcji zawiera więcej graczy niż istnieje w players1 + players2 (wynik zawiera powtórzenia niektórych graczy)
Dziękuję bardzo! Nie wiedziałem, że 'games1' w' Q' będzie iterować wszystkie gry. Powiedz mi, dlaczego używasz 'games1__pk = self.pk' zamiast' games1 = self'? Czy są w ten sposób jakieś zalety? – imkost
@imkost: Jestem do tego przyzwyczajony. Wierzę, że 'games1 = self' może być niejawnie przetłumaczone na' games1__pk = self.pk' (jeśli daje taki sam wynik). Posiadanie '__' w nazwie argumentu również wyjaśnia, że w zapytaniu jest zaangażowanych' JOIN'. – Tadeck