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 requests库编码 socks5代理的问题
May 07 Python
selenium3+python3环境搭建教程图解
Dec 07 Python
浅谈Python 多进程默认不能共享全局变量的问题
Jan 11 Python
python矩阵/字典实现最短路径算法
Jan 17 Python
Python socket实现多对多全双工通信的方法
Feb 13 Python
Python操作rabbitMQ的示例代码
Mar 19 Python
python实现定时压缩指定文件夹发送邮件
Dec 22 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
May 13 Python
python实现输入任意一个大写字母生成金字塔的示例
Oct 27 Python
Django用数据库表反向生成models类知识点详解
Mar 25 Python
Python基于当前时间批量创建文件
May 07 Python
Python基于爬虫实现全网搜索并下载音乐
Feb 14 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
《五等分的花嫁》漫画完结!2020年10月第2期TV动画制作组换血!
2020/03/06 日漫
基于PHP异步执行的常用方式详解
2013/06/03 PHP
php引用返回与取消引用的详解
2013/06/08 PHP
PHP转换IP地址到真实地址的方法详解
2013/06/09 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
PHP防范SQL注入的具体方法详解(测试通过)
2014/05/09 PHP
PHP getNamespaces()函数讲解
2019/02/03 PHP
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
js动态为代码着色显示行号
2013/05/29 Javascript
JavaScript基于setTimeout实现计数的方法
2015/05/08 Javascript
Bootstrap每天必学之按钮(Button)插件
2016/04/25 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
详解Angular中的自定义服务Service、Provider以及Factory
2017/04/22 Javascript
JS小球抛物线轨迹运动的两种实现方法详解
2017/12/20 Javascript
vue底部加载更多的实例代码
2018/06/29 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
redux.js详解及基本使用
2019/05/24 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
2019/06/19 Javascript
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
解决iView Table组件宽度只变大不变小的问题
2020/11/13 Javascript
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
Python切片索引用法示例
2018/05/15 Python
selenium+python 对输入框的输入处理方法
2018/10/11 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
Pandas操作CSV文件的读写实现方法
2019/11/13 Python
python 使用elasticsearch 实现翻页的三种方式
2020/07/31 Python
你的自行车健身专家:FaFit24
2016/11/16 全球购物
以实惠的价格提供高品质的时尚:Newchic
2018/01/18 全球购物
工程采购员岗位职责
2014/03/09 职场文书
爱护花草树木的标语
2014/06/11 职场文书
国企干部对照检查材料
2014/08/22 职场文书
公安派出所所长四风问题个人对照检查材料
2014/10/04 职场文书
统计员岗位职责
2015/02/11 职场文书
素质拓展训练感想
2015/08/07 职场文书
vue backtop组件的实现完整代码
2021/04/07 Vue.js
简单了解 MySQL 中相关的锁
2021/05/25 MySQL