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的装饰器的运用
May 05 Python
python实现简单ftp客户端的方法
Jun 28 Python
Python实现一个简单的验证码程序
Nov 03 Python
python机器学习库常用汇总
Nov 15 Python
python 接收处理外带的参数方法
Dec 03 Python
python的继承知识点总结
Dec 10 Python
Flask框架踩坑之ajax跨域请求实现
Feb 22 Python
itchat-python搭建微信机器人(附示例)
Jun 11 Python
TensorFlow:将ckpt文件固化成pb文件教程
Feb 11 Python
计算Python Numpy向量之间的欧氏距离实例
May 22 Python
Python读写csv文件流程及异常解决
Oct 20 Python
Django 如何实现文件上传下载
Apr 08 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
mysql5详细安装教程
2007/01/15 PHP
php中文验证码实现示例分享
2014/01/12 PHP
php准确计算复活节日期的方法
2015/04/18 PHP
必须收藏的23个php实用代码片段
2016/02/02 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
2017/08/14 PHP
一个简单的JavaScript 日期计算算法
2009/09/11 Javascript
Javascript中定义方法的另类写法(批量定义js对象的方法)
2011/02/25 Javascript
js模拟C#中List的简单实例
2014/03/06 Javascript
jQuery实现平滑滚动到指定锚点的方法
2015/03/20 Javascript
不能不知道的10个angularjs英文学习网站
2016/03/23 Javascript
Node.js 应用跑得更快 10 个技巧
2016/04/03 Javascript
实例解析jQuery中如何取消后续执行内容
2016/12/01 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
nodejs基础之多进程实例详解
2018/12/27 NodeJs
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
从Node.js事件触发器到Vue自定义事件的深入讲解
2020/06/26 Javascript
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
Python入门教程之if语句的用法
2015/05/14 Python
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
shell命令行,一键创建 python 模板文件脚本方法
2018/03/20 Python
Python实现简单的用户交互方法详解
2018/09/25 Python
python requests爬取高德地图数据的实例
2018/11/10 Python
Python适配器模式代码实现解析
2019/08/02 Python
python opencv 简单阈值算法的实现
2019/08/04 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
canvas实现飞机打怪兽射击小游戏的示例代码
2018/07/09 HTML / CSS
墨西哥网上购物:Linio墨西哥
2016/10/20 全球购物
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
工程地质勘察专业大学生求职信
2013/10/13 职场文书
制衣厂各岗位职责
2013/12/02 职场文书
讲座主持词
2014/03/20 职场文书
大型活动组织方案
2014/05/10 职场文书
中学清明节活动总结
2014/07/04 职场文书
泰山导游词
2015/02/02 职场文书
MySQL范围查询优化的场景实例详解
2022/06/10 MySQL