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 相关文章推荐
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
Apr 09 Python
Python在Windows和在Linux下调用动态链接库的教程
Aug 18 Python
对dataframe进行列相加,行相加的实例
Jun 08 Python
python去掉 unicode 字符串前面的u方法
Oct 21 Python
Python的Lambda函数用法详解
Sep 03 Python
python 多进程并行编程 ProcessPoolExecutor的实现
Oct 11 Python
Python正则表达式学习小例子
Mar 03 Python
基于Python的Jenkins的二次开发操作
May 12 Python
django中related_name的用法说明
May 20 Python
Pycharm自动添加文件头注释和函数注释参数的方法
Oct 23 Python
python之django路由和视图案例教程
Jul 26 Python
Python读写yaml文件
Mar 20 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写入WRITE编码为UTF8的文件的实现代码
2008/07/07 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
2017/06/09 PHP
PHP的PDO预处理语句与存储过程
2019/01/27 PHP
建立良好体验度的Web注册系统ajax
2007/07/09 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
推荐5 个常用的JavaScript调试技巧
2015/01/08 Javascript
javascript实现3D变换的立体圆圈实例
2015/08/06 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
2015/12/01 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
一分钟理解js闭包
2016/05/04 Javascript
jQuery 判断是否包含在数组中Array[]的方法
2016/08/03 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
2016/11/29 Javascript
微信小程序 监听手势滑动切换页面实例详解
2017/06/15 Javascript
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
2018/07/30 Javascript
解决vue select当前value没有更新到vue对象属性的问题
2018/08/30 Javascript
泛谈JS逻辑判断选择器 || &amp;&amp;
2019/05/24 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
python使用xpath中遇到:到底是什么?
2018/01/04 Python
将pandas.dataframe的数据写入到文件中的方法
2018/12/07 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
Python Web框架之Django框架Model基础详解
2019/08/16 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
Python ATM功能实现代码实例
2020/03/19 Python
PyCharm 2020.2 安装详细教程
2020/09/25 Python
英国婴儿及儿童产品商店:TigerParrot
2019/03/04 全球购物
应届生保险求职信
2013/11/11 职场文书
幼儿园教师自我鉴定
2014/03/20 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
行政求职信
2014/07/04 职场文书
学校工作推荐信范文
2014/07/11 职场文书
对外汉语专业大学生职业生涯规划范文
2014/09/13 职场文书
师范生见习总结范文
2015/06/23 职场文书
银行客户经理培训心得体会
2016/01/09 职场文书
培训心得体会怎么写
2016/01/25 职场文书
python3读取文件指定行的三种方法
2021/05/24 Python