Django模型--跨表

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>
                   ]>


4. 多重跨表

查询侦探学院学生报名的课程

In [63]: Course.objects.filter(students__college__name='侦探学院')               
Out[63]: <QuerySet [<Course: <案情分析>[名侦探柯南]>]>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值