2010-02-07 10 views
69

내가 모델이 있습니다장고 ManyToMany 필터()

class Zone(models.Model): 
    name = models.CharField(max_length=128) 
    users = models.ManyToManyField(User, related_name='zones', null=True, blank=True) 

를 그리고 난의 라인을 따라 필터를 contruct해야합니다

u = User.objects.filter(...zones contains a particular zone...) 

그것은 사용자의 필터이어야하고있다 단일 필터 매개 변수가됩니다. 그 이유는 admin 사용자 변경 목록을 필터링하기 위해 URL 쿼리 문자열을 구성하기 때문입니다. http://myserver/admin/auth/user/?zones=3

그것은 단순해야하지만 내 두뇌가 협조하지 않는 것처럼 보입니다!

+7

내가 얻을 수 있는지 확실하지 않습니다 당신이 바로 - 아니다'User.objects.filter (zones__id = )'또는'User.objects.filter (zones__in = )'이것에 좋습니까? –

+0

괜찮아요 :) BTW'User.objects.filter (zones__in = )'User.objects.filter (zones__id__in = ) 여야합니다. –

+10

단지 이것을 알아내는 사람에게 지적하고 싶습니다. related_name 일 때만 작동합니다. 설정됩니다. 예를 들어 zone_set이 작동하지 않습니다. 좋은 반 시간 낭비 :-) –

답변

77

토마스가 말한 것을 다시 말하면서.

many-to-manymany-to-one 테스트에는 FOO__in=... 스타일 필터의 예제가 많이 있습니다. 여기에 특정 문제에 대한 구문입니다 querysets로 작업 할 때

users_in_1zone = User.objects.filter(zones__id=<id1>) 
# same thing but using in 
users_in_1zone = User.objects.filter(zones__in=[<id1>]) 

# filtering on a few zones, by id 
users_in_zones = User.objects.filter(zones__in=[<id1>, <id2>, <id3>]) 
# and by zone object (object gets converted to pk under the covers) 
users_in_zones = User.objects.filter(zones__in=[zone1, zone2, zone3]) 

이중 밑줄 (__) 구문은 사방에 사용됩니다.

+0

문서 링크가 끊어졌지만 괜찮습니다. – maxm

+0

감사합니다. @maxm. 일부 예제에 대한 최신 링크로 업데이트되었습니다. – istruble

+0

링크가 끊어졌습니다. – maazza

10

사용자가 쿼리에 사용 된 여러 영역에있을 수있는 경우 .distinct()를 추가 할 수 있습니다. 그렇지 않으면 당신은 한 사용자가 여러 번 얻을 :

users_in_zones = User.objects.filter(zones__in=[zone1, zone2, zone3]).distinct()