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 collections模块实例讲解
Apr 07 Python
python判断字符串是否包含子字符串的方法
Mar 24 Python
Python多进程机制实例详解
Jul 02 Python
基于Django contrib Comments 评论模块(详解)
Dec 08 Python
用pandas中的DataFrame时选取行或列的方法
Jul 11 Python
Python3 jupyter notebook 服务器搭建过程
Nov 30 Python
在unittest中使用 logging 模块记录测试数据的方法
Nov 30 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
Mar 14 Python
Python 仅获取响应头, 不获取实体的实例
Aug 21 Python
python使用pip安装SciPy、SymPy、matplotlib教程
Nov 20 Python
Python实现七个基本算法的实例代码
Oct 08 Python
Python类方法总结讲解
Jul 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
ThinkPHP行为扩展Behavior应用实例详解
2014/07/22 PHP
php中__toString()方法用法示例
2016/12/07 PHP
php实现银联商务公众号+服务窗支付的示例代码
2019/10/12 PHP
网页自动跳转代码收集
2009/09/27 Javascript
jQuery中append、insertBefore、after与insertAfter的简单用法与注意事项
2020/04/04 Javascript
对xmlHttp对象的理解
2011/01/17 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
2013/02/04 Javascript
JQuery操作tr和td内容的方法实例
2013/03/06 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
js实现Select列表各项上移和下移的方法
2015/08/14 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
javascript如何创建对象
2016/08/29 Javascript
JS实现json的序列化和反序列化功能示例
2017/06/13 Javascript
微信小程序之绑定点击事件实例详解
2017/07/07 Javascript
javascript计算渐变颜色的实例
2017/09/22 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
javascript实现简易的计算器
2020/01/17 Javascript
Element InputNumber 计数器的实现示例
2020/08/03 Javascript
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
Python如何实现强制数据类型转换
2019/11/22 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
尼克松手表官网:Nixon手表
2019/03/17 全球购物
英语专业学子个人的自我评价
2013/10/02 职场文书
火箭队口号
2014/06/18 职场文书
餐厅周年庆活动方案
2014/08/25 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
银行给客户的感谢信
2015/01/23 职场文书
个人工作保证书
2015/02/28 职场文书
生日宴会祝酒词
2015/08/10 职场文书
小学体育队列队形教学反思
2016/02/16 职场文书
员工安全责任协议书
2016/03/22 职场文书
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python
golang实现浏览器导出excel文件功能
2022/03/25 Golang
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫
windows系统搭建WEB服务器详细教程
2022/08/05 Servers