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求两个list的差集、交集与并集的方法
Nov 01 Python
python实现复制整个目录的方法
May 12 Python
Python中使用urllib2模块编写爬虫的简单上手示例
Jan 20 Python
python使用turtle库绘制时钟
Mar 25 Python
Python内置random模块生成随机数的方法
May 31 Python
分享8个非常流行的 Python 可视化工具包
Jun 05 Python
python实现tail -f 功能
Jan 17 Python
Python 创建TCP服务器的方法
Jul 28 Python
Python 爬虫的原理
Jul 30 Python
python 如何利用argparse解析命令行参数
Sep 11 Python
Python三维绘图之Matplotlib库的使用方法
Sep 20 Python
用 Django 开发一个 Python Web API的方法步骤
Dec 03 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
利用discuz实现PHP大文件上传应用实例代码
2008/11/14 PHP
php下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
在PHP中使用curl_init函数的说明
2010/11/02 PHP
ThinkPHP关联模型操作实例分析
2012/09/23 PHP
PHP中$_SERVER使用说明
2015/07/05 PHP
js字符串截取函数substr substring slice使用对比
2013/11/27 Javascript
node.js中的fs.appendFileSync方法使用说明
2014/12/17 Javascript
js实现漂浮回顶部按钮实例
2015/05/06 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
laydate.js日期时间选择插件
2017/01/04 Javascript
nodejs中向HTTP响应传送进程的输出
2017/03/19 NodeJs
AngularJS自定义指令之复制指令实现方法
2017/05/18 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
2018/04/13 Javascript
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
js实现每日签到功能
2018/11/29 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
js实现无缝轮播图插件封装
2020/07/31 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
python 计算两个日期相差多少个月实例代码
2017/05/24 Python
pytorch如何冻结某层参数的实现
2020/01/10 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
解决python 执行sql语句时所传参数含有单引号的问题
2020/06/06 Python
用CSS3将你的设计带入下个高度
2009/08/08 HTML / CSS
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/04/11 面试题
魅力教师事迹材料
2014/01/10 职场文书
建筑结构施工专业推荐信
2014/02/21 职场文书
档案保密承诺书
2014/06/03 职场文书
2014教师教育实践活动对照检查材料思想汇报
2014/09/21 职场文书
2014年工作总结与下年工作计划
2014/11/27 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
Python 语言实现六大查找算法
2021/06/30 Python
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python