2009-12-30 20 views
51

Estoy intentando filtrar una tabla en Django en función del valor de un campo particular de una clave externa.Django: filtrado de propiedades de clave externa

Por ejemplo, tengo dos modelos -

# models.py 
class Asset(models.Model): 
name = models.TextField(max_length=150) 
project = models.ForeignKey('Project') 

class Project(models.Model): 
name = models.TextField(max_length=150) 

me gustaría filtrar mi lista de activos basado en el nombre del proyecto asociado.

Actualmente estoy realizando dos consultas:

# views.py 
project_list = Project.objects.filter(name__contains="Foo")   
asset_list = Asset.objects.filter(desc__contains=filter, project__in=project_list).order_by('desc') 

Me pregunto si hay una forma de especificar este tipo de filtrado de la consulta principal?

Respuesta

71

Asset.objects.filter(project__name__contains="Foo")

+1

Gracias, Lo había intentado pero aparentemente había olvidado usar doble guión bajo. –

+0

es necesario? – DeadDjangoDjoker

9

Esto ha sido posible desde que la rama queryset-refactor aterrizó antes de la 1.0. Ticket 4088 expuso el problema. Esto debería funcionar:

Asset.objects.filter(
    desc__contains=filter, 
    project__name__contains="Foo").order_by("desc") 

El Django Many-to-one documentation tiene este y otros ejemplos de claves externas siguiente utilizando el API de modelo.

+0

¿Esto va a golpear la base de datos dos veces, debo utilizar select_related() Para hacer esto más óptima? –

+4

Puede agregar .query.as_sql() para ver qué sql se ejecutará en realidad. – fastmultiplication

+0

el enlace a los documentos de django está completamente desactualizado y aterriza en una 'página 410 eliminada': -/ – szeitlin

Cuestiones relacionadas