Django学习之模型层---多表操作之查(二)

1>基于双下划线的跨表查询(转成sql语句就是sql的join查询)

    前一篇将的基于对象的跨表查询,都是基于相互之间有关联关系的表的查询,本篇主要是讲当多个表之间

    没有关联关系,应该怎么链表查询,其实就是用双下划线连接,可链接多个,一直链到你想要的那张表为止

    就类似于sql的join,如由四张表 A,B,C,D,我想通过A表的条件查找D表的结果,但是A和D没有直接关联,但是

    A和B有关联,B和C有,C和D有,那么就可以通过 A join B join C join D on 关联字段 where 筛选条件

    来取的最后的结果,ORM中写法如下 A__B__C__D.xxx

    从例子切入把,先把之前表关系和表数据拿过来,方便对照查询

开局之前,还是要强调一遍:正向查询按字段,反向查询按表名小写用来告诉ORM引擎join哪张表

2>一对多

     查询魔戒三部曲这本书的出版社的名字

     如下两种不同方式,因ORM的filter和value就类似于sql的 where 和select,一个筛选条件,一个是筛选结果

    所以,ORM这边对应也有不同的写法,方式一:基于boook,先筛选出书本,再链接出版社表,取出版社表

    的名称字段,方式二:基于出版社表,先链接boook表筛选出本对象,再取自己的名称字段。

3>多对多

    查询作者是hql发布的所有书籍名称

如下,两种方式:

方式1:通过Author表join与其关联的Boook表,属于反向查询:按表名小写boook通知ORM引擎join book_authors与Boook表

方式2:通过Boook表join与其关联的Author表,属于正向查询:按字段authors通知ORM引擎join book_authors与Author表

4>一对一

    查询天下霸唱的手机号

5>多表进阶(连续跨表)

查询手机号以11开头的作者出版过的所有书籍名称以及该书籍对应的出版社名称

如上,通过不同的维度,写法也不一样,看究竟是筛选条件,还是筛选结果,以及基表跟其他表链接时,究竟如何跨表等等

6>总结:

   如上,链表越多,写法也就越多,谨记3点:

     -->弄清楚当前表链接其他表时 是正向还是反向

     --->正向就通过关联字段,反向就通过表名小写

     --->链表顺序一定是根据有关系的一个一个链到想要的表,不可能两个完全没关系的链到一起,没意义。

猜你喜欢

转载自blog.csdn.net/huangql517/article/details/81198079