ORM查询之基于对象的正向查询与反向查询
2018-11-20 03:26:03来源:博客园 阅读 ()
一、为什么有正向查询和反向查询?
举例有两张表,一张表叫书籍表,一张表叫出版社表,他们关系是一对多的关系,书籍是多,出版社是一,因为一本书应该只有一个出版社对应,而出版社可以有多本书对应。
那么在实际代码中定义他们关系的类中,设置外键的那个属性"publisher"是在多的那个类中,也就是在书籍这个类中,所以在书籍类中,想要知道某一本书对应的出版社,就可以通过实例化一个对象,然后通过他的属性publisher又实例化一个出版社的对象,拿到对应的出版社,这个按照python的解释来说,就是正常的通过一个实例化对象,取某一个属性,很正常,逻辑顺序明了,被称之为正向查询;但是在出版社表中,对应的类中,它只有与自己属性相关的定义啊,比如出版社名字,地址等等,它没有属性是来确定和书籍这个表有关系的,所以,想取某一个出版社对应的有哪些书,用实例化一个对象来操作,行不通,这时这种情况就是反向查询了。
两种查询具体怎么操作,如下:
给出两个表对应的类定义和生成的数据表:
书籍类:
生成的对应数据表:
出版社类:
生成的对应数据表:
正向查询
现在通过正向查询,也就是要查询某本书对应的是哪一个出版社。从上面的表中,我们看到,书籍是有重复的,但是出版社是一样的,那么查询ID=2的那本书对应的出版社。
1 from orm测试.models import Book #导入Book模块 2 3 b=Book.objects.filter(id=2)[0] 4 #当后面不加[0]时,拿到的是一个QuerySet集合,加上就是一个对象,只有对象才能取值。 5 6 7 8 chubanshe=b.publisher.name 9 #b已经是书籍的一个对象,b.publisher又是一个对象,这个对象就是出版社的对象,因为#publisher是Book类中的一个外键。b.publisher.name就拿到了对应的出版社名字。 10 11 print(chubanshe)
来看看上面代码每一步拿到的都是些什么。
代码:b=Book.objects.filter(id=2)拿到的是什么(不加[0])?如图:
b拿到的是一个QuerySet集合,类型是django类型的类(这个是什么具体还不清楚),但是这个肯定不是我想要的对象。
代码:b=Book.objects.filter(id=2)[0]拿到的是什么?如图:
b输出是一个具体的值?但是实际上并不是,打印它的类型一看就知道,它其实是一个类实例化的一个对象,也就是想要查询id=2这本书叫“三国演义”的对象。
代码:chubanshe=b.publisher.name拿到的是什么?
分开来看这句代码,先看chubanshe=b.publisher是什么?先把b.publisher的值赋给了chubanshe,方便输出查看。
首先publisher是Book类的一个属性,同时也是一个外键,很明显b.publisher是在拿属性的值。看看它拿到的是什么?如图:
看到,结果是跟上面一样,也是一个具体的值,其实就是出版社的一个实例化的一个对象。好了,到这里明白了,既然出版社的一个实例化的对象有了,那么取里面属性的值就很好办了。
代码chubanshe=b.publisher.name拿到的自然就是从一开始想要得到那本书本的对应的出版社的名字:
结果就是想要的,对应的出版社,查表可以确定结果只正确的,并且这个值的类型是字符串类型,一个真正的值。
反向查询
现在通过反向查询,也就是要查询某个出版社对应哪些书。那么查询ID=2这个出版社有哪些书。
既然是反向,出发点一定是从表出版社出发,查到表书籍。
1 1 from orm测试.models import Publish 2 2 3 3 p=Publish.objects.filter(id=2)[0] #这里跟正向查询一样,拿到一个对象 4 4 5 5 ret=p.book_set.values("title").distinct() #取出版社对应的所有书 6 6 7 7 print(ret)
这里主要分析代码ret=p.book_set.values("title").distinct()
book_set是反向查询的一个方法,book对应的就是要到Book表里面,_set就是拿到了要查询的所有书籍,distinct()是去重。
结果如图:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Python字符串常用方法(一)
下一篇:图解get方法与filter方法
- python 之 前端开发(form标签、单选框、多选框、file上传文 2019-08-13
- 基于tornado---异步并发接口 2019-07-24
- Python 重点知识整理(基于Python学习手册第四版) 2019-07-24
- 【Demo 1】基于object_detection API的行人检测 1:环境与依 2019-07-24
- python 之 网络编程(基于UDP协议的套接字通信) 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash