django model filter django-queryset

Django Queryset con filtrado en clave externa inversa



django filter (4)

Django no es compatible con el método select_related () para búsquedas inversas de claves externas, por lo que lo mejor que puede hacer sin abandonar Python son dos consultas de bases de datos. La primera es tomar todas las Marcas que contienen MakeContents donde publicado = True, y la segunda es tomar todas las MakeContents donde publicado = True. Luego tiene que recorrer y ordenar los datos como lo desee. Aquí hay un buen artículo sobre cómo hacer esto:

http://blog.roseman.org.uk/2010/01/11/django-patterns-part-2-efficient-reverse-lookups/

Tengo el siguiente modelo de Django:

class Make: name = models.CharField(max_length=200) class MakeContent: make = models.ForeignKey(Make) published = models.BooleanField()

Me gustaría saber si es posible (sin escribir SQL directamente) que genere un conjunto de consulta que contenga todas las Make y las relacionadas con MakeContent s donde MakeContent published = True .


Permítanme traducir la respuesta redactada de Spike en códigos para futuros espectadores. Tenga en cuenta que cada ''Make'' puede tener cero a múltiples ''MakeContent''

Si el asker significa consultar ''Hacer'' con AL MENOS UN ''MakeContent'' cuyo publicado = True, el segundo fragmento de Jason Christa responde la pregunta.

El fragmento es equivalente a

makes = Make.objects.select_related().filter(makecontent__published=True).distinct()

Pero si el asker significa consultar ''Hacer'' con TODO ''MakeContent'' cuyo publicado = True, entonces siguiendo las ''marcas'' anteriores,

import operator make_ids = [m.id for m in makes if reduce(operator.and_, [c.published for c in m.makecontent_set.all()] ) ] makes_query = Make.objects.filter(id__in=make_ids)

contiene la consulta deseada.


Si, creo que quieres

make = Make.objects.get(pk=1) make.make_content_set.filter(published=True)

o tal vez

make_ids = MakeContent.objects.filter(published=True).values_list(''make_id'', flat=True) makes = Make.objects.filter(id__in=make_ids)


Sé que esta es una pregunta muy antigua, pero estoy respondiendo. Como creo que mi respuesta puede ayudar a otros. He cambiado un poco el modelo de la siguiente manera. He usado Django 1.8.

class Make(models.Model): name = models.CharField(max_length=200) class MakeContent(models.Model): make = models.ForeignKey(Make, related_name=''makecontent'') published = models.BooleanField()

He usado el siguiente queryset.

Make.objects.filter(makecontent__published=True)

Espero que ayude