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 27 Python
python获取本地计算机名字的方法
Apr 29 Python
python基础入门学习笔记(Python环境搭建)
Jan 13 Python
Python3.x对JSON的一些操作示例
Sep 01 Python
Pycharm远程调试openstack的方法
Nov 21 Python
python实现一个简单的并查集的示例代码
Mar 19 Python
python引入不同文件夹下的自定义模块方法
Oct 27 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
pycharm部署、配置anaconda环境的教程
Mar 24 Python
python网络编程之五子棋游戏
May 14 Python
Pytorch转tflite方式
May 25 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
Jun 03 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
暴雪前总裁遗憾:没尽早追赶Dota 取消星际争霸幽灵
2020/03/08 星际争霸
smarty section简介与用法分析
2008/10/03 PHP
php多次include后导致全局变量global失效的解决方法
2015/02/28 PHP
PHP获取文件扩展名的方法实例总结
2017/06/10 PHP
如何优雅的使用 laravel 的 validator验证方法
2018/11/11 PHP
js form action动态修改方法
2008/11/04 Javascript
jquery validator 插件增加日期比较方法
2010/02/21 Javascript
对之前写的jquery分页做下升级
2014/06/19 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
使用jQuery实现返回顶部
2015/01/26 Javascript
jQuery构造函数init参数分析
2015/05/13 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
2015/06/04 Javascript
浅析JavaScript中命名空间namespace模式
2016/06/22 Javascript
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
2017/03/28 NodeJs
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
jQuery实现获取及设置CSS样式操作详解
2018/09/05 jQuery
node上的redis调用优化示例详解
2018/10/30 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
如何进行微信公众号开发的本地调试的方法
2019/06/16 Javascript
Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作
2020/08/31 Javascript
在Python中处理时间之clock()方法的使用
2015/05/22 Python
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
Python登录注册验证功能实现
2018/06/18 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
2016/01/27 HTML / CSS
Canvas实现保存图片到本地的示例代码
2018/06/28 HTML / CSS
全球领先的美容用品专卖店:Beauty Plus Salon
2018/09/04 全球购物
澳大利亚最早和最古老的巨型游戏专家:Yardgames
2020/02/20 全球购物
Yahoo的PHP面试题
2014/05/26 面试题
测试工程师程序员求职信范文
2014/02/20 职场文书
巴西世界杯32强口号
2014/06/05 职场文书
开展警示教育活动总结
2015/05/09 职场文书
房屋所有权证明
2015/06/19 职场文书
《惊弓之鸟》教学反思
2016/02/20 职场文书