2013-06-29 16 views
12

Ich arbeite mit Django und ich muss ein Abfrage-Set mit zwei inneren Joins tun.Django Inner Beitreten Queryset

Ich habe drei Modelle A, B und C, und ich möchte eine Abfrage wie folgt in psql tun:

select DISTINCT a from A inner join B on B.a_id = A.id inner join C on C.b_id = B.id;

Modelle (nur relevante Felder enthalten)

class A(models.Model): 
    id = models.IntegerField(primary_key=True) 

class B(models.Model): 
    id = models.IntegerField(primary_key=True) 
    a = models.ForeignKey(A, null=True, blank=True,on_delete=models.SET_NULL) 

class C(models.Model): 
    b = models.ForeignKey(B, null=True, on_delete=models.SET_NULL) 

Also alles in C verbindet sich zurück zu einer Sache in B und alles in B verbindet sich zurück zu einer Sache in A. Ich möchte versuchen, und alle eindeutigen Elemente in A, die etwas in C haben.

Wie mache ich das mit django queryset? Vielen Dank.

+0

Es wäre toll, wenn Sie Ihre Modelle zeigen und sagen, was Sie erreichen möchten – karthikr

+0

@karthikr hinzugefügt die Modelle und was ich versuche zu tun – user1998511

Antwort

24

A.objects.filter(b__c__isnull=False) Ergebnisse a sql w/elbe Ergebnis:

SELECT DISTINCT a.* FROM a INNER JOIN b ON (a.id = b.a_id) INNER JOIN c ON (b.id=c.b_id) 
WHERE c.id IS NOT NULL; 

P.S. Warum verwenden Sie IntegerField anstelle von AutoField für IDs?

+0

Awesome, danke! Ich benutze AutoField, ich habe es einfach falsch kopiert. – user1998511