合并django中的查询集

时间:2013-01-07 05:02:03

标签: python django merge django-queryset

我在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

P.S。我知道有|操作者:

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

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

2 个答案:

答案 0 :(得分:11)

对于一个更为语义清晰的解决方案:

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

答案 1 :(得分: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在此处详细说明:Complex lookups with Q objects