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)
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对象进行复杂查找.
| 归档时间: |
|
| 查看次数: |
12558 次 |
| 最近记录: |