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中的魔法方法深入理解
Jul 09 Python
深入探究Python中变量的拷贝和作用域问题
May 05 Python
学习python之编写简单简单连接数据库并执行查询操作
Feb 27 Python
python相似模块用例
Mar 04 Python
Python更新数据库脚本两种方法及对比介绍
Jul 27 Python
python的dataframe和matrix的互换方法
Apr 11 Python
python批量替换多文件字符串问题详解
Apr 22 Python
Python中的Django基本命令实例详解
Jul 15 Python
django DRF图片路径问题的解决方法
Sep 10 Python
python 将有序数组转换为二叉树的方法
Mar 26 Python
PIL对上传到Django的图片进行处理并保存的实例
Aug 07 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
Jan 15 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
使用php伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
ThinkPHP视图查询详解
2014/06/30 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
Laravel框架中集成MongoDB和使用详解
2019/10/17 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
javascript AutoScroller 函数类
2009/05/29 Javascript
javascript getElementsByName()的用法说明
2009/07/31 Javascript
IE8中动态创建script标签onload无效的解决方法
2014/12/22 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
2017/03/09 Javascript
JavaScript设置名字输入不合法的实现方法
2017/05/23 Javascript
Angular如何引入第三方库的方法详解
2017/07/13 Javascript
vue按需引入element Transfer 穿梭框
2017/09/30 Javascript
JS运动特效之链式运动分析
2018/01/24 Javascript
实例详解vue.js浅度监听和深度监听及watch用法
2018/08/16 Javascript
vue-router的使用方法及含参数的配置方法
2018/11/13 Javascript
微信小程序中转义字符的处理方法
2019/03/28 Javascript
json 带斜杠时如何解析的实现
2019/08/12 Javascript
解决使用layui的时候form表单中的select等不能渲染的问题
2019/09/18 Javascript
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python set常用操作函数集锦
2017/11/15 Python
举例讲解Python常用模块
2019/03/08 Python
python如何将两个txt文件内容合并
2019/10/18 Python
Python 安装 virturalenv 虚拟环境的教程详解
2020/02/21 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
2021/01/27 Python
详解HTML5中的标签
2015/06/19 HTML / CSS
SmartBuyGlasses意大利:购买太阳镜、眼镜和隐形眼镜
2018/11/20 全球购物
高尔夫球鞋、服装、手套和装备:FootJoy
2018/12/15 全球购物
EJB timer的种类
2014/10/28 面试题
如何整合JQuery和Prototype
2014/01/31 面试题
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
升职演讲稿范文
2014/05/23 职场文书
三八妇女节演讲稿
2014/05/27 职场文书
报案材料怎么写
2015/05/25 职场文书
儿童诗两首教学反思
2016/02/23 职场文书