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 相关文章推荐
使用rst2pdf实现将sphinx生成PDF
Jun 07 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
Nov 16 Python
浅析Git版本控制器使用
Dec 10 Python
python获取服务器响应cookie的实例
Dec 28 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
Jun 20 Python
Pycharm新建模板默认添加个人信息的实例
Jul 15 Python
python3的print()函数的用法图文讲解
Jul 16 Python
Python实现剪刀石头布小游戏(与电脑对战)
Dec 31 Python
Python 实现opencv所使用的图片格式与 base64 转换
Jan 09 Python
python使用pandas抽样训练数据中某个类别实例
Feb 28 Python
Python将二维列表list的数据输出(TXT,Excel)
Apr 23 Python
Python实现定时监测网站运行状态的示例代码
Sep 30 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 智能404跳转代码,适合换域名没改变目录的网站
2010/06/04 PHP
PHP实现下载断点续传的方法
2014/11/12 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
php 解决substr()截取中文字符乱码问题
2016/07/18 PHP
JavaScript实现仿网易通行证表单验证
2015/05/25 Javascript
浅析javascript中的事件代理
2015/11/06 Javascript
易被忽视的js事件问题总结
2016/05/14 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
微信小程序中用WebStorm使用LESS
2017/03/08 Javascript
js实现图片上传预览原理分析
2017/07/13 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
2017/09/11 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
2018/01/09 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
JS实现将二维数组转为json格式字符串操作示例
2018/07/12 Javascript
vue里面使用mui的弹出日期选择插件实例
2018/09/16 Javascript
vue实现微信获取用户信息的方法
2019/03/21 Javascript
vue中created和mounted的区别浅析
2019/08/13 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
Python实现的金山快盘的签到程序
2013/01/17 Python
python文本数据相似度的度量
2018/03/12 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
python logging日志模块原理及操作解析
2019/10/12 Python
python将数组n等分的实例
2019/12/02 Python
详解Python中的分支和循环结构
2020/02/11 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
基于HTML5 Canvas 实现商场监控实例详解
2017/11/20 HTML / CSS
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
设置器与访问器的定义以及各自特点
2016/01/08 面试题
python+selenium小米商城红米K40手机自动抢购的示例代码
2021/03/24 Python
销售经理竞聘书
2014/03/31 职场文书
团结就是力量演讲稿
2014/05/21 职场文书
安全教育第一课观后感
2015/06/17 职场文书
高中地理教学反思
2016/02/19 职场文书
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python
Redis读写分离搭建的完整步骤
2021/09/14 Redis