2011-03-30 72 views
8

I tienen los siguientes modelos en mi proyecto Django:Django filtrar a través de varios campos de una tabla de intermediario muchos-a-muchos

class Video(models.Model): 
    media = models.ForeignKey(Media) 

class Media(models.Model): 
    title = models.CharField(max_length=255) 
    formats = models.ManyToManyField(Format,through='MediaFormat',related_name='media',blank=True) 

class Format(models.Model): 
    title = models.CharField(max_length=50) 

class MediaFormat(models.Model): 
    status = models.IntegerField() 
    format = models.ForeignKey(Format) 
    media = models.ForeignKey(Media) 

Ahora, quiero filtrar todos los videos que tienen un formato específico, y de la el código de estado para ese formato es 10 (listo para usar). ¿Cómo puedo hacer eso? (suponiendo que f es el formato):

f = Format.objects.get(pk=3) 

Estoy tentado a usar:

Video.objects.filter(media__formats=f, media__mediaformat__status=10) 

Pero entonces, que devolvería todos los vídeos que coinciden estos dos supuestos:

  • a) contienen ese formato específico, y
  • b) contienen cualquier formato con el estado de 10

¿Cómo se supone que debo filtrar solo a aquellos que tienen ese formato específico en un código de estado de 10?

gracias!

+0

FYI si desea O dos conjuntos de consultas, creo que usa '|' entre los conjuntos de consultas. No estoy seguro de lo útil que esto es para OP, pero debería ayudar a otros que vienen aquí. – Pureferret

Respuesta

8

Puede encadenar los filtros juntos para una construcción "Y".

vídeos donde el formato es f y el estado del formato es 10

Video.objects.filter(media__formats=f).filter(media__mediaformat__status=10) 
+2

No estoy seguro de cómo es diferente a la sugerencia de OP: Video.objects.filter (media__formats = f, media__mediaformat__status = 10) – jarmod

+0

En realidad, es diferente de la sugerencia OP. Consulte https://docs.djangoproject.com/ es/1.10/topics/db/queries/# spanning-multi-valued-relationships para su referencia – klis87

10

Ahora, quiero filtrar todos los videos que tienen un formato específico, y el código de estado para ese formato es 10 (listo para usar). ¿Cómo puedo hacer eso? (suponiendo que f es el formato)

El código que envió va a hacer exactamente lo que quiere:

Video.objects.filter(media__formats=f, media__mediaformat__status=10) 

Esto está documentado en the filter() documentation:

múltiples parámetros se unen a través de AND en la instrucción SQL subyacente.

2

Probablemente no es relevante para la OP, pero podría ser para otros como yo que se encuentran A este hilo, mientras que la búsqueda de la respuesta correcta.

Ludwik lo hizo bien, pero la sección en la documentación que explica todo esto, así como cómo hacer las exclusiones, está en el queries documentation.

Tenga en cuenta que dividir el filtro en dos llamadas filter como Chris sugirió le dará el resultado exactamente opuesto: buscará un video que tenga un formato de medios f y que tenga un formato de medios, no necesariamente el mismo formato de medios, con un estado de 10.

Cuestiones relacionadas