Tengo un modelo:
class Zone(models.Model):
name = models.CharField(max_length=128)
users = models.ManyToManyField(User, related_name='zones', null=True, blank=True)
Y necesito construir un filtro a lo largo de las líneas de:
u = User.objects.filter(...zones contains a particular zone...)
Tiene que ser un filtro en Usuario y debe ser un único parámetro de filtro. La razón de esto es que estoy construyendo una cadena de consulta de URL para filtrar la lista de cambios del usuario administrador:http://myserver/admin/auth/user/?zones=3
¡Parece que debería ser simple, pero mi cerebro no está cooperando!
django
django-models
Andy Baker
fuente
fuente
User.objects.filter(zones__id=<id>)
niUser.objects.filter(zones__in=<id(s)>)
bueno para esto?User.objects.filter(zones__in=<id(s)>)
probablemente debería serUser.objects.filter(zones__id__in=<id(s)>)
Respuestas:
Simplemente repitiendo lo que dijo Tomasz.
Hay muchos ejemplos de
FOO__in=...
filtros de estilo en las pruebas de muchos a muchos y de muchos a uno . Aquí hay una sintaxis para su problema específico:La sintaxis de subrayado doble (__) se usa por todas partes cuando se trabaja con conjuntos de consultas .
fuente
...__in
ejemplos después# filtering on a few zones, by id
. Esos muestran el filtrado para múltiples identificadores / objetos (en este caso). Simplemente pase los identificadores / objetos zone1, zone3 y zone10 que le interesan. O agregue un cuarto si es necesario.Tenga en cuenta que si el usuario puede estar en varias zonas utilizadas en la consulta, es probable que desee agregar .distinct (). De lo contrario, obtendrá un usuario varias veces:
fuente
Otra forma de hacerlo es a través de la tabla intermedia. Expresaría esto dentro del Django ORM así:
sería bueno si no necesitara lo
.values('user')
especificado, pero Django (versión 3.0.7) parece necesitarlo.el código anterior terminará generando SQL que se parece a:
lo cual es bueno porque no tiene uniones intermedias que puedan hacer que se devuelvan usuarios duplicados
fuente