Django模型–跨表
1. 简介
Django通过sql的关键字inner
,为查询提供了跨表延申。想要跨模型查询,只需要相关模型的模型名加上连接符__
(双下划线),直到达到需要的字段为止。
举个栗子:1. 查询男生报名课程;2. 查询报名火遁课程的学生。
#1 查询男生报名课程;
In [52]: Course.objects.filter(students__gender=1)
#查询的是课程所以选Course表,限定条件为男生,所以跨表字段 student__gender=1
Out[52]: <QuerySet [
<Course: <案情分析>:[名侦探柯南]>,
<Course: <火遁>:[火遁卷轴]>
]>
#2 查询报名火遁课程的学生。
In [53]: Student.objects.filter(enroll__courses__name='火遁')
#查询的是学生,选Student模型;限定条件是课程为火遁,Student 和 Course 表是多对多关系、又指定中间表为Ebroll,所以跨表字段 enroll__courses__name='火遁'
Out[53]: <QuerySet [
<Student: id<8>name[纳鲁淘]gender(男)age|16|c_time:2019-03-20 15:28:16+00:00>
]>
#因为多对多关系中可以通过模型名直接访问关联表管理器,所以2可以改为
In [54]: Student.objects.filter(course__name='火遁')
Out[54]: <QuerySet [<
Student: id<8>name[纳鲁淘]gender(男)age|16|c_time:2019-03-20 15:28:16+00:00>
]> # 两者一样。
2. 字段
查询学生柯南的学院
In [57]: College.objects.filter(student__name='柯南')
Out[57]: <QuerySet [
<College: <侦探学院>:[侦探大陆]>
]>
- 跨表查询中字段直接使用模型名,注意与多对一实例中
模型名__set
有多区别,不能混淆; - 模型名只能使用关联表,上例中条件若改为
studetail__student__pk=1
则抛出异常FiledError – Choices are: address, id, name, student,即参数异常。
3. 多样匹配
查询报名火遁相关课程的学生
In [61]: Student.objects.filter(course__name__contains='火遁')
Out[61]: <QuerySet [<
Student: id<8>name[纳鲁淘]gender(男)age|16|c_time:2019-03-20 15:28:16+00:00>
]>
- contains 表示模糊查询,相关内容请查阅 Django模型–mysql-查询篇
4. 多重跨表
查询侦探学院学生报名的课程
In [63]: Course.objects.filter(students__college__name='侦探学院')
Out[63]: <QuerySet [<Course: <案情分析>:[名侦探柯南]>]>