Django之多表操作2
查询记录
数据库操作最常用的还是查询操作,在介绍ORM下多表关联查询时,需要事先记住关于ORM模型的一个非常重要的概念:在使用模型类进行多表关联查询时,如果确定两张表存在关联关系,那么在选取一个表作为起始(为了后续描述方便,我们将其简称为"基表")后,可以跨表引用来自另外一张中的字段值,这存在正向与反向之分
如果关联字段存在于基表中,称之为正向查询,否则,称之为反向查询
例如表模Book与Publish,关联字段存在于Book中
# 当以Book为基表时,称之为正向查询 Book(基表)-------正向---------->Publish # 当以Publish为基表时,称之为反向查询 Book<-------反向----------Publish(基表)
使用原生sql进行多表关联查询时无非两种方式:子查询、join连表查询,ORM里同样有两种查询方式(严格依赖正向、反向的概念)
基于对象的跨表查询
1、一对一查询(模型类Author与AuthorDetail)
正向查询,按关联字段:author_detail
# 需求:查询作者egon的手机号 # 1、先取出作者对象 egon=Author.objects.filter(name='egon').first() # 2、正向查询:根据作者对象下的关联字段author_detail取到作者详情 print(egon.author_detail.tel) # 输出:18611312331
反向查询,按模型名(小写):author
# 需求:查询手机号为'15679331379 '的作者名 # 1、先取出作者的详情对象 tel=AuthorDetail.objects.filter(tel='15679331379').first() # 2、反向查询:根据小写的模型名author取到作者对象 print(tel.author.name) # 输出:egon
2、多对一查询(模型类Book与Publish)
正向查询,按关联字段:publish
# 需求:查询葵花宝典的出版社名字 # 1、先取书籍对象 book_obj=Book.objects.filter(title='葵花宝典').first() # 2、正向查询:根据书籍对象下的关联字段publish取到出版社 print(book_obj.publish.name) # 输出:北京出版社
反向查询,按模型名(小写)_set:book_set
# 需求:查询葵花宝典的出版社名字 # 1、先取书籍对象 book_obj=Book.objects.filter(title='葵花宝典').first() # 2、正向查询:根据书籍对象下的关联字段publish取到出版社 print(book_obj.publish.name) # 输出:北京出版社
3、多对多查询(模型类Book与Author)
正向查询,按关联字段,如authors
# 需求:查询葵花宝典的所有作者 # 1、先取出书籍对象 book_obj=Book.objects.filter(title='葵花宝典').first() # 2、正向查询:根据书籍对象下的关联字段authors取到所有作者 author_objs=book_obj.authors.all() print([obj.name for obj in author_objs]) # 输出:['egon', 'kevin']
反向查询,按模型名(小写)_set:如author_set
# 需求:查询作者rose出版的所有书籍 # 1、先取出作者对象 egon=Author.objects.filter(name='rose').first() # 2、反向查询:根据book_set取到作者对象 book_objs=egon.book_set.all() print([book_obj.title for book_obj in book_objs]) # 输出:['玉女心经', '九阴真经', '玉男心经']
4、连续跨>2张表查询
连续跨>2张表的操作的套路与上面的案例都是一样的
# 需求:查询葵花宝典的作者们的手机号 book_obj=Book.objects.filter(title='葵花宝典').first() author_objs=book_obj.authors.all() print([author_obj.author_detail.tel for author_obj in author_objs]) # 输出:['18611312331', '15033413881']

浙公网安备 33010602011771号