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中字典(dict)和列表(list)的排序方法实例
Jun 16 Python
零基础写python爬虫之使用Scrapy框架编写爬虫
Nov 07 Python
在windows系统中实现python3安装lxml
Mar 23 Python
PyCharm使用教程之搭建Python开发环境
Jun 07 Python
Python中的多行注释文档编写风格汇总
Jun 16 Python
python通过百度地图API获取某地址的经纬度详解
Jan 28 Python
numpy数组广播的机制
Jul 12 Python
Python+OpenCv制作证件图片生成器的操作方法
Aug 21 Python
python实现批处理文件
Jul 28 Python
关于Kotlin中SAM转换的那些事
Sep 15 Python
Python SQLAlchemy库的使用方法
Oct 13 Python
重构Python代码的六个实例
Nov 25 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
BBS(php &amp; mysql)完整版(二)
2006/10/09 PHP
WML,Apache,和 PHP 的介绍
2006/10/09 PHP
基于PHP+Ajax实现表单验证的详解
2013/06/25 PHP
PHP中异常处理的一些方法整理
2015/07/03 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
php关联数组与索引数组及其显示方法
2018/03/12 PHP
php输出控制函数和输出函数生成静态页面
2019/06/27 PHP
读jQuery之六 缓存数据功能介绍
2011/06/21 Javascript
『jQuery』.html(),.text()和.val()的概述及使用
2013/04/22 Javascript
学习JavaScript设计模式之策略模式
2016/01/12 Javascript
vue.js+boostrap项目实践(案例详解)
2016/09/21 Javascript
jquery获取easyui日期控件的值实现方法
2016/11/09 Javascript
HTML5 js实现拖拉上传文件功能
2020/11/20 Javascript
jQuery实现可兼容IE6的滚动监听功能
2017/09/20 jQuery
支付宝小程序tabbar底部导航
2018/11/06 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
vue 解决addRoutes多次添加路由重复的操作
2020/08/04 Javascript
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
Python程序员开发中常犯的10个错误
2014/07/07 Python
Python新手实现2048小游戏
2015/03/31 Python
Python实现Windows上气泡提醒效果的方法
2015/06/03 Python
Python通过matplotlib绘制动画简单实例
2017/12/13 Python
python模块之paramiko实例代码
2018/01/31 Python
对python中矩阵相加函数sum()的使用详解
2019/01/28 Python
对Django 中request.get和request.post的区别详解
2019/08/12 Python
Django实现从数据库中获取到的数据转换为dict
2020/03/27 Python
详解vscode实现远程linux服务器上Python开发
2020/11/10 Python
python性能测试工具locust的使用
2020/12/28 Python
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
党员年终民主评议的自我评价
2013/11/05 职场文书
信息管理与信息系统专业求职信
2014/06/21 职场文书
2014年市场部工作总结
2014/11/25 职场文书
交通安全教育心得体会
2016/01/15 职场文书
《倍数和因数》教学反思
2016/02/23 职场文书
2016年社区综治宣传月活动总结
2016/03/16 职场文书
如何写一份成功的商业计划书
2019/06/25 职场文书