209 votes

Django ManyToMany filtre()

J'ai un modèle:

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

Et j'ai besoin de contruct un filtre le long des lignes de:

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

Il doit être un filtre sur l'Utilisateur et il doit être d'un seul paramètre de filtre. La raison pour cela est que je suis de la construction d'une URL de requête pour filtrer l'utilisateur admin changelist: http://myserver/admin/auth/user/?zones=3

Il semble que ce devrait être simple, mais mon cerveau n'est pas coopératif!

251voto

istruble Points 5686

Juste retraitement ce Tomasz a dit.

Il existe de nombreux exemples d' FOO__in=... filtres de style dans le plusieurs-à-plusieurs et plusieurs-à-un tests. Voici la syntaxe pour votre problème spécifique:

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

Le double trait de soulignement (__) syntaxe est utilisée partout lorsque l'on travaille avec querysets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X