>

다음 모델이 있습니다 :

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)

보시다시피 그룹은 플레이어 인 멤버로 구성되어 있습니다. 내가하고 싶은 것은이 두 선수가 모두 포함 된 그룹을 필터링 할 수 있기를 원하는 두 명의 선수가 주어진다는 것입니다. 그러나 이런 유형의 쿼리를 수행하는 방법을 잘 모르겠습니다.


  • 답변 # 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))
    
    

관련 자료

  • 이전 xamarin - 명령 매개 변수로 버튼 값 전달
  • 다음 javascript - 편집기에서 스크립트 기능을 실행하면 예상대로 작동하지 않습니다