2009-12-30 7 views
51

J'essaie de filtrer une table dans Django en fonction de la valeur d'un champ particulier d'une clé étrangère.Django - Filtrage sur les propriétés de clés étrangères

Par exemple, j'ai deux modèles -

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

Je voudrais filtrer ma liste d'actifs en fonction du nom du projet associé.

Actuellement je exécute deux requêtes:

# 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') 

Je me demande s'il y a un moyen de spécifier ce type de filtrage dans la requête principale?

Répondre

71

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

+1

Merci, J'avais essayé ça mais apparemment j'avais oublié d'utiliser le double underscore. –

+0

est nécessaire contient ?? – DeadDjangoDjoker

9

Cela a été possible depuis que la branche queryset-refactor a atterri avant la version 1.0. Ticket 4088 a exposé le problème. Cela devrait fonctionner:

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

Le Django Many-to-one documentation a ceci et d'autres exemples de la suite de clés étrangères en utilisant l'API du modèle.

+0

Est-ce que ça va frapper la DB deux fois, devrais-je utiliser select_related() pour rendre plus optimale? –

+4

Vous pouvez ajouter un fichier .query.as_sql() pour voir ce que SQL va réellement être exécuté. – fastmultiplication

+0

le lien vers les docs django est complètement démodé et atterrit sur une '410 Page retirée': -/ – szeitlin

Questions connexes