Как отфильтровать результаты модели по нескольким значениям для поля многие ко многим в django - PullRequest
27 голосов
/ 23 февраля 2012

У меня есть следующая модель:

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)

Как видите, группа состоит из игроков, которые являются игроками. Что я хотел бы сделать, так это дать двух игроков, которые я хотел бы иметь возможность фильтровать группы, в которых содержатся оба этих игрока, но я не уверен, как выполнять этот тип запроса.

Ответы [ 3 ]

35 голосов
/ 23 февраля 2012

Если ваша 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)
20 голосов
/ 15 апреля 2013

Самое простое решение для вас будет:

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

Обратите внимание, что вы не можете использовать фильтр __in, как это, потому что это приведет к ИЛИ и возврату групп, которые не содержат обоих игроков:

Group.objects.filter(member__in=[1, 2])
2 голосов
/ 31 августа 2017

Для меня __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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...