django框架基于queryset和双下划线的跨表查询操作详解


Posted in Python onDecember 11, 2019

本文实例讲述了django框架基于queryset和双下划线的跨表查询操作。分享给大家供大家参考,具体如下:

前面篇随笔写的是基于对象的跨表查询:对象.objects.filter(。。。)  对象.关联对象_set.all(...)  -->反向

基于对象的跨表查询例如:

book_obj= Book.objects.filter(id=4).first() #注意多了个first
  print(book_obj) #go 这里得到的是一个models对象
  print(book_obj.publish.name) #桔子出版社

这篇随笔主要写的是基于双下划线的跨表查询,其本质是使用join连接其他表进行查询

一对多

def query(request):
  #正向查询
  ret1=Book.objects.filter(title='西游记').values("publish__name")
  print(ret1) #<QuerySet [{'publish__name': '榴莲出版社'}]>
  print(ret1.first(),type(ret1.first())) #{'publish__name': '榴莲出版社'} <class 'dict'> 注意key 为 publish__name
  print(ret1.first()['publish__name']) # 榴莲出版社
  #反向查询
  ret2=Publish.objects.filter(book__title="西游记").values('name') #这里的book是表名称,book表里面有字段 title
  print('---------------------------------')
  print(ret2) #<QuerySet [{'name': '榴莲出版社'}]>
  print(ret2.first()['name'])#榴莲出版社
return HttpResponse('ok')

多对多

#查询python书的作者的名字和年龄
def query(request):
  #正向查询
  ret = Book.objects.filter(title="python").values("authors__name","authors__age")
  print(ret) #注意结果的key
  #结果 <QuerySet [{'authors__name': 'wang', 'authors__age': 27}, {'authors__name': 'xiao', 'authors__age': 25}, {'authors__name': 'zhang', 'authors__age': 26}]>
  #反向查询
  ret = Author.objects.filter(book__title="python").values("name","age")
  print(ret) #区分正向查询的key
  #结果 <QuerySet [{'name': 'wang', 'age': 27}, {'name': 'xiao', 'age': 25}, {'name': 'zhang', 'age': 26}]>
  return HttpResponse('ok')

一对一

例子:查询名字为 xiao 的gf是什么

def query(request):
  #正向查询
  ret=Author.objects.filter(name='xiao').values('ad__gf') #Author设置了外键到 AuthorDetail
  print(ret) #<QuerySet [{'ad__gf': '刘诗诗'}]>
  #反向查询
  ret=AuthorDetail.objects.filter(author__name='xiao').values('gf')
  print(ret) #<QuerySet [{'gf': '刘诗诗'}]>
  return HttpResponse('ok')

 下面进行跨多表查询,涉及三个表或者以上

#查询西瓜出版社出版过的书籍和书籍作者的名字
def query(request):
  #正向
  ret=Book.objects.filter(publish__name="西瓜出版社").values_list("title",'authors__name')
  print(ret)
#<QuerySet [('三国演义', 'zhang'), ('python', 'xiao'), ('python', 'zhang'), ('python', 'wang')]>
  #反向
  ret = Publish.objects.filter(name="西瓜出版社").values_list("book__title","book__authors__age","book__authors__name")
  print(ret)
#<QuerySet [('三国演义', 26, 'zhang'), ('python', 25, 'xiao'), ('python', 26, 'zhang'), ('python', 27, 'wang')]>
  return HttpResponse('ok')

django框架基于queryset和双下划线的跨表查询操作详解

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

def query(request):
  #正向
  ret = Book.objects.filter(authors__ad__tel__startswith="11").values("title","publish__name")
  print(ret)
  #< QuerySet[{'title': 'python', 'publish__name': '西瓜出版社'}, {'title': '三国演义', 'publish__name': '西瓜出版社'}] >
  #反向
  ret = Author.objects.filter(ad__tel__startswith="11").values("book__title","book__publish__name")
  print(ret)
#<QuerySet [{'book__title': '三国演义', 'book__publish__name': '西瓜出版社'}, {'book__title': 'python', 'book__publish__name': '西瓜出版社'}]>
  return HttpResponse('查询成功')

django框架基于queryset和双下划线的跨表查询操作详解

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
Python 提取dict转换为xml/json/table并输出的实现代码
Aug 28 Python
centos6.4下python3.6.1安装教程
Jul 21 Python
Django REST为文件属性输出完整URL的方法
Dec 18 Python
python调用百度语音识别实现大音频文件语音识别功能
Aug 30 Python
python scipy求解非线性方程的方法(fsolve/root)
Nov 12 Python
Python3 关于pycharm自动导入包快捷设置的方法
Jan 16 Python
Django实现发送邮件找回密码功能
Aug 12 Python
使用pytorch实现可视化中间层的结果
Dec 30 Python
通过Python实现一个简单的html页面
May 16 Python
Python读取yaml文件的详细教程
Jul 21 Python
详解分布式系统中如何用python实现Paxos
May 18 Python
Python预测分词的实现
Jun 18 Python
django框架ModelForm组件用法详解
Dec 11 #Python
django框架中ajax的使用及避开CSRF 验证的方式详解
Dec 11 #Python
通过实例解析Python调用json模块
Dec 11 #Python
Flask中endpoint的理解(小结)
Dec 11 #Python
Python中Flask-RESTful编写API接口(小白入门)
Dec 11 #Python
Python zip函数打包元素实例解析
Dec 11 #Python
基于Python实现扑克牌面试题
Dec 11 #Python
You might like
收音机的保养
2021/03/01 无线电
Mysql和网页显示乱码解决方法集锦
2008/03/27 PHP
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
PHP中Trait及其应用详解
2017/02/14 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
JavaScript 检测浏览器和操作系统的脚本
2008/12/26 Javascript
Jquery中dialog属性小记
2010/09/03 Javascript
Iframe自适应高度绝对好使的代码 兼容IE,遨游,火狐
2011/01/27 Javascript
js 遍历对象的属性的代码
2011/12/29 Javascript
asm.js使用示例代码
2013/11/28 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
一看就懂:jsonp详解
2015/06/01 Javascript
zepto中使用swipe.js制作轮播图附swipeUp,swipeDown不起效果问题
2015/08/27 Javascript
js实现左侧网页tab滑动门效果代码
2015/09/06 Javascript
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
2016/11/02 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
angular2 ng2-file-upload上传示例代码
2018/08/23 Javascript
使用python实现正则匹配检索远端FTP目录下的文件
2015/03/25 Python
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
在Python中,不用while和for循环遍历列表的实例
2019/02/20 Python
python3.5 cv2 获取视频特定帧生成jpg图片
2019/08/28 Python
django drf框架自带的路由及最简化的视图
2019/09/10 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
Python爬虫之Selenium实现键盘事件
2020/12/04 Python
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
美国首屈一指的礼品篮供应商:GiftTree
2018/01/06 全球购物
大学生毕业自我评价范文分享
2013/11/07 职场文书
生产厂长岗位职责
2014/02/21 职场文书
课程改革实施方案
2014/03/16 职场文书
搞笑爱情保证书
2014/04/29 职场文书
法人授权委托书公证范本
2014/09/14 职场文书
大学生毕业个人总结
2015/02/15 职场文书
mybatis3中@SelectProvider传递参数方式
2021/08/04 Java/Android
「约定的梦幻岛」作画发布诺曼生日新绘
2022/03/21 日漫