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编写的最短路径算法
Mar 25 Python
在Linux上安装Python的Flask框架和创建第一个app实例的教程
Mar 30 Python
Python 机器学习库 NumPy入门教程
Apr 19 Python
Python实现处理逆波兰表达式示例
Jul 30 Python
Python 循环终止语句的三种方法小结
Jun 24 Python
Python中查看变量的类型内存地址所占字节的大小
Jun 26 Python
FFrpc python客户端lib使用解析
Aug 24 Python
Python 字符串类型列表转换成真正列表类型过程解析
Aug 26 Python
python3实现弹弹球小游戏
Nov 25 Python
如何利用python读取micaps文件详解
Oct 18 Python
python中 .npy文件的读写操作实例
Apr 14 Python
baselines示例程序train_cartpole.py的ImportError
May 20 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动态图像的创建
2006/10/09 PHP
几个有用的php字符串过滤,转换函数代码
2012/05/01 PHP
深入PHP nl2br()格式化输出的详解
2013/06/05 PHP
解析PHP中的unset究竟会不会释放内存
2013/07/18 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
PHP实现的DES加密解密类定义与用法示例
2020/11/02 PHP
Yii2语言国际化自动配置详解
2018/08/22 PHP
jquery 简单的进度条实现代码
2010/03/11 Javascript
jQuery之选项卡的简单实现
2014/02/28 Javascript
javascript实现的一个随机点名功能
2014/08/26 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
原生js实现回复评论功能
2017/01/18 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
详解redux异步操作实践
2018/08/15 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
[01:03]悬念揭晓 11月26日DOTA2完美盛典不见不散
2017/11/23 DOTA
python求解水仙花数的方法
2015/05/11 Python
Python中字符串的常见操作技巧总结
2016/07/28 Python
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
详解Python下ftp上传文件linux服务器
2018/06/21 Python
Python从单元素字典中获取key和value的实例
2018/12/31 Python
python aiohttp的使用详解
2019/06/20 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
2019/06/20 Python
python输入多行字符串的方法总结
2019/07/02 Python
python分割一个文本为多个文本的方法
2019/07/22 Python
python的Jenkins接口调用方式
2020/05/12 Python
html5教程制作简单画板代码分享
2013/12/04 HTML / CSS
Michael Kors加拿大官网:购买设计师手袋、手表、鞋子、服装等
2019/03/16 全球购物
在Java开发中如何选择使用哪种集合类
2016/08/09 面试题
大学三年的自我评价
2013/12/25 职场文书
致跳高运动员广播稿
2014/01/13 职场文书
单位作风建设剖析材料
2014/10/11 职场文书
Html5通过数据流方式播放视频的实现
2021/04/27 HTML / CSS