2017-04-12 19 views
0

以下型號給出:如何做一個JOIN在多個Django模型

class Copy(CommonLibraryBaseModel): 
    lecture = models.ForeignKey('Lecture', ...) 
    signature = models.CharField(max_length=100, ...) 

class Lecture(CommonLibraryBaseModel): 
    category = models.ForeignKey('LectureCategory', ...) 

class LectureCategory(CommonLibraryBaseModel): 
    parent = models.ForeignKey('self', ...) 
    display_name = models.CharField(max_length=100, ...) 

我基本上要做到以下查詢:

SELECT signature, display_name FROM lecturecategory as lc, lecture as l, copy as c WHERE lc.id = l.category_id AND c.lecture_id = l.id AND lc.parent_id=2; 

我將如何做到這一點在Django?我無法弄清楚如何組合不同的模型。

感謝您的幫助!

回答

2
SELECT signature, display_name 
FROM lecturecategory as lc, lecture as l, copy as c 
WHERE lc.id = l.category_id AND c.lecture_id = l.id AND lc.parent_id=2; 

將是:

Copy.objects.filter(lecture__category__parent_id=2).values_list('signature', 'lecture__category__display_name') 

如果你想dictionnary的結果QuerSet,使用values代替values_list。 Values_list返回一個元組。 Documentation about lookup relationship

0

你可以得到Copy實例的查詢集有以下過濾器

copies = Copy.objects.filter(lecture__category_parent_id=2) 

參見lookups that span relationships的文檔獲取更多信息。

然後,您可以遍歷查詢集,並使用外鍵訪問相關的講座和講座類別。

for copy in copies: 
    print(copy.signature, copy.lecture.category.display_name) 

最後,你可以改變使用select_related初始查詢,讓Django使用一個內連接來獲取演講和類別,而不是單獨的查詢:

copies = Copy.objects.filter(lecture__category_parent_id=2).select_related('lecture', lecture__category')