A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

ORM查询之基于对象的正向查询与反向查询
一、为什么有正向查询和反向查询?
举例有两张表,一张表叫书籍表,一张表叫出版社表,他们关系是一对多的关系,书籍是多,出版社是一,因为一本书应该只有一个出版社对应,而出版社可以有多本书对应。
那么在实际代码中定义他们关系的类中,设置外键的那个属性"publisher"是在多的那个类中,也就是在书籍这个类中,所以在书籍类中,想要知道某一本书对应的出版社,就可以通过实例化一个对象,然后通过他的属性publisher又实例化一个出版社的对象,拿到对应的出版社,这个按照python的解释来说,就是正常的通过一个实例化对象,取某一个属性,很正常,逻辑顺序明了,被称之为正向查询;但是在出版社表中,对应的类中,它只有与自己属性相关的定义啊,比如出版社名字,地址等等,它没有属性是来确定和书籍这个表有关系的,所以,想取某一个出版社对应的有哪些书,用实例化一个对象来。
给出两个表对应的类定义和生成的数据表:



正向查询
现在通过正向查询,也就是要查询某本书对应的是哪一个出版社。从上面的表中,我们看到,书籍是有重复的,但是出版社是一样的,那么查询ID=2的那本书对应的出版社。

from orm测试.models import Book           #导入Book模块
b=Book.objects.filter(id=2)[0]
#当后面不加[0]时,拿到的是一个QuerySet集合,加上就是一个对象,只有对象才能取值。chubanshe=b.publisher.name   
#b已经是书籍的一个对象,b.publisher又是一个对象,这个对象就是出版社的对象,因为#publisher是Book类中的一个外键。b.publisher.name就拿到了对应的出版社名字。
print(chubanshe)   
反向查询
现在通过反向查询,也就是要查询某个出版社对应哪些书。那么查询ID=2这个出版社有哪些书。
既然是反向,出发点一定是从表出版社出发,查到表书籍。

from orm测试.models  import Publish
p=Publish.objects.filter(id=2)[0]         #这里跟正向查询一样,拿到一个对象
ret=p.book_set.values("title").distinct()    #取出版社对应的所有书
print(ret)
这里主要分析代码ret=p.book_set.values("title").distinct()
book_set是反向查询的一个方法,book对应的就是要到Book表里面,_set就是拿到了要查询的所有书籍,distinct()是去重。

更多图片 小图 大图
组图打开中,请稍候......

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马