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

2024-04-25 22:42:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下型号:

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)

正如你所看到的,这个小组是由球员组成的。我想做的是给两个玩家,我想能够过滤包含这两个玩家的组,但我不确定如何做这种类型的查询。


Tags: nameselfdefaultdatetimemodelmodelsgrouplength
3条回答

对我来说,__in不起作用。我最后用了complex Q lookup 它工作得很好,您可以使用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))

最简单的解决方案是:

p1 = Player.objects.get(id=1)
p2 = Player.objects.get(id=2)
groups = Group.objects.filter(member=p1).filter(member=p2)

注意,不能像这样使用'uu-in过滤器,因为这将导致一个或和返回不包含两个玩家的组:

Group.objects.filter(member__in=[1, 2])

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

class Player(models.Model):
    name = models.CharField(max_length=200)

然后,可以执行此查询:

Group.objects.filter(player__name__in=['Player1','Player2'])

大致翻译为“查找所有名字与'Player1'和'Player2'匹配的玩家组”

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

p1 = Player.objects.get(name='Player1')
p2 = Player.objects.get(name='Player2')
groups = Group.objects.filter(player=p1).filter(player=p2)

相关问题 更多 >