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字符转换
Sep 06 Python
在django中使用自定义标签实现分页功能
Jul 04 Python
Python实现字符串的逆序 C++字符串逆序算法
May 28 Python
对dataframe进行列相加,行相加的实例
Jun 08 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
Oct 15 Python
Windows系统Python直接调用C++ DLL的方法
Aug 01 Python
Django连接数据库并实现读写分离过程解析
Nov 13 Python
PyCharm使用Docker镜像搭建Python开发环境
Dec 26 Python
python 成功引入包但无法正常调用的解决
Mar 09 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
Sep 21 Python
Python如何把不同类型数据的json序列化
Apr 30 Python
pandas中DataFrame检测重复值的实现
May 26 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随机数生成代码与使用实例分析
2011/04/08 PHP
深入Apache与Nginx的优缺点比较详解
2013/06/17 PHP
php版微信公众号接口实现发红包的方法
2016/10/14 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
2019/03/08 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
JS面向对象编程 for Cookie
2010/09/19 Javascript
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
jquery获取tr中控件值并操作tr实现思路
2013/03/27 Javascript
解决JS中乘法的浮点错误的方法
2014/01/03 Javascript
详解javascript实现瀑布流绝对式布局
2016/01/29 Javascript
jQuery操作属性和样式详解
2016/04/13 Javascript
全面了解javascript中的错误处理机制
2016/07/18 Javascript
对js中回调函数的一些看法
2016/08/29 Javascript
微信小程序 开发之快递查询功能的实现
2017/01/09 Javascript
Bootstrap DateTime Picker日历控件简单应用
2017/03/25 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
2019/05/07 Javascript
JavaScript相等运算符的九条规则示例详解
2019/10/20 Javascript
[01:50]2014DOTA2西雅图邀请赛 专访欢乐周宝龙
2014/07/08 DOTA
python在命令行下使用google翻译(带语音)
2014/01/16 Python
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
Django 用户认证组件使用详解
2019/07/23 Python
Ranorex通过Python将报告发送到邮箱的方法
2020/01/12 Python
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
CSS3实现复选框动画特效示例代码
2016/09/27 HTML / CSS
前端水印的简单实现代码示例
2020/12/02 HTML / CSS
澳洲的服装老品牌:SABA
2018/02/06 全球购物
abstract class和interface有什么区别
2013/08/04 面试题
员工自我鉴定
2013/10/09 职场文书
好的自荐信包括什么内容
2013/11/07 职场文书
商务英语专业毕业生求职信
2014/07/06 职场文书
检讨书模板
2015/01/29 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript