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

Фильтр Django ManyToMany()

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

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

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

4b9b3361

Ответ 1

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

Существует много примеров фильтров стиля 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.

Ответ 2

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

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