2009-12-30 25 views
51

Sto provando a filtrare una tabella in Django in base al valore di un particolare campo di una chiave esterna.Django - filtro sulle proprietà di chiave esterna

Per esempio ho due modelli -

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

vorrei filtrare la mia lista di asset in base al nome del progetto associato.

Attualmente sto eseguendo due query:

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

Mi chiedo se c'è un modo per specificare questo tipo di filtro nella query principale?

risposta

71

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

+1

Grazie, L'avevo provato ma a quanto pare avevo dimenticato di usare il doppio trattino basso. –

+0

è necessario ?? – DeadDjangoDjoker

9

Ciò è stato possibile dal momento che il ramo queryset-refactor è atterrato pre-1.0. Ticket 4088 esposto il problema. Questo dovrebbe funzionare:

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

Il Django Many-to-one documentation ha questo e altri esempi di seguito chiavi esterne utilizzando l'API Modello.

+0

È questo che va a colpire il DB due volte, dovrei usare select_related() per renderlo più ottimale? –

+4

È possibile aggiungere un .query.as_sql() per vedere quale sql verrà effettivamente eseguito. – fastmultiplication

+0

il collegamento ai documenti django è completamente obsoleto e atterra su una '410 pagina rimossa': -/ – szeitlin

Problemi correlati