如何对多个Django模型进行连接

2024-09-28 05:18:33 发布

您现在位置:Python中文网/ 问答频道 /正文

给出了以下模型:

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我该怎么做?我想不出如何把不同的模型结合起来。你知道吗

谢谢你的帮助!你知道吗


Tags: 模型idmodelsaslengthmaxclasssignature
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的查询集,请使用values而不是values\u list。值列表返回一个元组。 Documentation about lookup relationship

您可以使用以下筛选器获得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')

相关问题 更多 >

    热门问题