2009-12-30 33 views
51

Ich versuche, eine Tabelle in Django basierend auf dem Wert eines bestimmten Felds eines Fremdschlüssels zu filtern.Django - Filtern nach Fremdschlüsseleigenschaften

Zum Beispiel habe ich zwei Modelle - meine Asset-Liste filtern basierend auf dem Namen des zugehörigen Projekts

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

Ich mag würde.

Derzeit bin ich Durchführung von zwei Anfragen:

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

Ich frage mich, ob es eine Möglichkeit ist, diese Art der Filterung in der Hauptabfrage angeben?

Antwort

71

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

+1

Danke, Ich hatte das versucht, aber anscheinend hatte ich vergessen, doppelte Unterstreichung zu verwenden. –

+0

enthält enthält ?? – DeadDjangoDjoker

9

Dies ist möglich, da der Zweig vor 1.0 gelandet ist. Ticket 4088 hat das Problem aufgedeckt. Dies sollte funktionieren:

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

Die Django Many-to-one documentation diese und andere Beispiele von folgenden Fremdschlüssel hat die Modell-API.

+0

Ist das geht die DB zweimal zu schlagen, sollte ich() verwenden select_related diese optimal mehr zu machen? –

+4

Sie können eine .query.as_sql() hinzufügen, um zu sehen, welche SQL tatsächlich ausgeführt wird. – fastmultiplication

+0

der Link zu den Django Docs ist völlig veraltet und landet auf einer '410 Seite entfernt': -/ – szeitlin