Фильтр Django ManyToMany () - PullRequest
       6

Фильтр Django ManyToMany ()

97 голосов
/ 08 февраля 2010

У меня есть модель:

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

И мне нужно создать фильтр в соответствии с:

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

Это должен быть фильтр для пользователя и один параметр фильтра. Причина этого заключается в том, что я создаю строку запроса URL-адреса для фильтрации списка изменений администратора: http://myserver/admin/auth/user/?zones=3

Кажется, все должно быть просто, но мой мозг не сотрудничает!

Ответы [ 2 ]

115 голосов
/ 08 февраля 2010

Просто повторяю то, что сказал Томаш.

Существует множество примеров фильтров стиля FOO__in=... в тестах многие-ко-многим и многие-к-одному . Вот синтаксис для вашей конкретной проблемы:

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])

Синтаксис двойного подчеркивания (__) используется повсеместно при работе с querysets .

22 голосов
/ 06 октября 2014

Обратите внимание, что если пользователь может находиться в нескольких зонах, используемых в запросе, возможно, вы захотите добавить .distinct ().В противном случае вы получите одного пользователя несколько раз:

users_in_zones = User.objects.filter(zones__in=[zone1, zone2, zone3]).distinct()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...