我在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(结果包含一些玩家的重复)
答案 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。