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

但它以一种非常奇怪的方式工作。此函数的结果包含的玩家数量多于玩家 1 + 玩家 2 中的玩家数量(结果包含一些玩家的重复)

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 回答