Подтвердить что ты не робот

Как фильтровать результаты модели для нескольких значений для многих или многих полей в 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)

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

4b9b3361

Ответ 1

Если ваша модель 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)

Ответ 2

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

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

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

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

Ответ 3

Для меня __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))