2017-04-12 52 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')