如何过滤django中多对多字段的多个值的模型结果

Jay*_*yyy 29 python django

我有以下型号:

class Group(models.Model):
    member = models.ManyToManyField(Player, through='GroupMember')
    name = models.CharField(max_length=20, unique=True)
    join_password = models.CharField(max_length=20)
    date_created = datetime.datetime.now()

    def __unicode__(self):
        return str(self.name)

class GroupMember(models.Model):
    member = models.ForeignKey(Player)
    group = models.ForeignKey(Group)
    rating = models.IntegerField(default=1500)
    played = models.IntegerField(default=0)
    wins = models.IntegerField(default=0)
    losses = models.IntegerField(default=0)
    experience = models.IntegerField(default=0)
    admin = models.BooleanField(default=0)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,该组由成员组成.我想做的是给两个玩家我希望能够过滤包含这两个玩家的组,但我不确定如何进行这种类型的查询.

Bur*_*lid 37

如果您的Player模型如下所示:

class Player(models.Model):
    name = models.CharField(max_length=200)
Run Code Online (Sandbox Code Playgroud)

然后,您可以执行此查询:

Group.objects.filter(player__name__in=['Player1','Player2'])
Run Code Online (Sandbox Code Playgroud)

其大致翻译为"查找所有名称与'Player1'和'Player2'匹配的玩家的群组"

或者您可以player单独获取对象:

p1 = Player.objects.get(name='Player1')
p2 = Player.objects.get(name='Player2')
groups = Group.objects.filter(player=p1).filter(player=p2)
Run Code Online (Sandbox Code Playgroud)

  • 这个答案实际上没有用,第一个例子运行一个OR - 它将显示包含BOTH玩家的所有组.最后一个示例没有执行,因为在同一个方法调用中不能有两个相同的kw参数.您可以链接过滤器,以获得所需的效果:Group.objects.filter(player = p1).filter(player = p2) (10认同)

Cha*_*her 21

最简单的解决方案是:

p1 = Player.objects.get(id=1)
p2 = Player.objects.get(id=2)
groups = Group.objects.filter(member=p1).filter(member=p2)
Run Code Online (Sandbox Code Playgroud)

请注意,您不能像这样使用__in过滤器,因为这将导致OR和不包含两个播放器的返回组:

Group.objects.filter(member__in=[1, 2])
Run Code Online (Sandbox Code Playgroud)


coo*_*ugh 7

对我来说__in没有用。我最终使用了复杂的 Q 查找 ,它可以完美运行,您可以使用它来or过滤条件。像这样使用它:

from django.db.models import Q

p1 = Player.objects.get(name='Player1')
p2 = Player.objects.get(name='Player2')
querySet = Group.objects.filter(Q(member=p1) | Q(member=p2))
Run Code Online (Sandbox Code Playgroud)

  • 这也将返回仅包含其中玩家的组。问题是关于具体有两名球员的小组。 (2认同)