2013-06-29 71 views
12

Tôi đang làm việc với Django và tôi cần thực hiện truy vấn bằng cách sử dụng hai kết nối bên trong.Django Inner Join Queryset

Tôi có ba mô hình A, B, và C và tôi muốn làm một truy vấn như sau trong psql:

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

Models: (chỉ bao gồm các lĩnh vực có liên quan)

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) 

Vì vậy, mọi thứ trong C liên kết ngược với một thứ trong B và mọi thứ trong B liên kết ngược lại một điều trong A. Tôi muốn thử và nhận tất cả các phần tử riêng biệt trong A có thứ gì đó trong C.

Làm cách nào để thực hiện việc này bằng truy vấn django? Cảm ơn.

+0

Sẽ thật tuyệt nếu bạn thể hiện mô hình của mình và cho biết những gì bạn đang cố gắng hoàn thành – karthikr

+0

@karthikr đã thêm các mô hình và những gì tôi đang cố gắng làm – user1998511

Trả lời

24

A.objects.filter(b__c__isnull=False) kết quả một sql w kết quả/giống nhau:

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; 

T.B. Tại sao bạn sử dụng IntegerField thay vì AutoField cho id?

+0

Thật tuyệt vời! Tôi thực sự sử dụng AutoField, tôi chỉ sao chép nó sai. – user1998511

Các vấn đề liên quan