8

私は持っていmodels.pyます:

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()))

どうすれば同じget_all_playersメソッドを書くことができますがQuerySet、ではなく戻りlistますか?

PS私はあることを知っています| オペレーター:

def get_all_players(self):
    return self.players1.all() | self.players2.all()

しかし、それは非常に奇妙な方法で機能します。この関数の結果には、players1 + player2よりも多くのプレーヤーが含まれています(結果には一部のプレーヤーの繰り返しが含まれています)

4

2 に答える 2

12

おそらくより意味的に明確な解決策の場合:

def get_all_players(self):
    return (self.players1.all() | self.players2.all()).distinct()
于 2015-07-24T10:57:05.243 に答える
10

これでうまくいくはずです:

# On the top of the file:
from django.db.models import Q

# Game instance method:
def get_all_players(self):
    return Player.objects.filter(Q(games1__pk=self.pk) | Q(games2__pk=self.pk))

Qここで詳細に説明されています: Q オブジェクトを使用した複雑なルックアップ

于 2013-01-07T05:08:45.247 に答える