合并django中的查询集

imk*_*ost 8 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()))
Run Code Online (Sandbox Code Playgroud)

我怎么能写同样的get_all_players方法,但是回来QuerySet,不是list吗?

PS我知道有| 运营商:

def get_all_players(self):
    return self.players1.all() | self.players2.all()
Run Code Online (Sandbox Code Playgroud)

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

lin*_*man 11

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

def get_all_players(self):
    return (self.players1.all() | self.players2.all()).distinct()
Run Code Online (Sandbox Code Playgroud)

  • 这绝对是更清洁的解决方案. (2认同)

Tad*_*eck 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))
Run Code Online (Sandbox Code Playgroud)

Q这里详细描述:使用Q对象进行复杂查找.