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中由于logging模块误用导致的内存泄露
Apr 23 Python
Python实现数据库编程方法详解
Jun 09 Python
python select.select模块通信全过程解析
Sep 20 Python
Python设计模式之代理模式简单示例
Jan 09 Python
详解PyTorch批训练及优化器比较
Apr 28 Python
对python程序内存泄漏调试的记录
Jun 11 Python
利用nohup来开启python文件的方法
Jan 14 Python
详解python的四种内置数据结构
Mar 19 Python
Django实现文件上传下载功能
Oct 06 Python
浅谈ROC曲线的最佳阈值如何选取
Feb 28 Python
Python 解析xml文件的示例
Sep 29 Python
python开发一款翻译工具
Oct 10 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数据库连接
2006/10/09 PHP
通过html表格发电子邮件
2006/10/09 PHP
用phpmyadmin更改mysql5.0登录密码
2008/03/25 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
win平台安装配置Nginx+php+mysql 环境
2016/01/12 PHP
PHP新特性详解之命名空间、性状与生成器
2017/07/18 PHP
基于jQuery图片平滑连续滚动插件
2009/04/27 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
jQuery控制TR显示隐藏的几种方法
2014/06/18 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
JavaScript新增样式规则(推荐)
2016/07/19 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
2016/12/16 Javascript
学习 NodeJS 第八天:Socket 通讯实例
2016/12/21 NodeJs
jQuery实现倒计时重新发送短信验证码功能示例
2017/01/12 Javascript
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
简单实现js鼠标跟随效果
2020/08/02 Javascript
Vue.js 实现微信公众号菜单编辑器功能(一)
2018/05/08 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
2018/11/14 Javascript
JS中min函数实例讲解
2019/02/18 Javascript
原生JS实现动态添加新元素、删除元素方法
2019/05/05 Javascript
微信小程序的tab选项卡的实现效果
2019/05/15 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
js实现幻灯片轮播图
2020/08/14 Javascript
原生JavaScript实现进度条
2021/02/19 Javascript
pandas实现将dataframe满足某一条件的值选出
2019/06/12 Python
Win 10下Anaconda虚拟环境的教程
2020/05/18 Python
Keras SGD 随机梯度下降优化器参数设置方式
2020/06/19 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
怎样客观的做好自我评价
2013/12/28 职场文书
领导党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
歌剧魅影观后感
2015/06/05 职场文书
放飞理想主题班会
2015/08/14 职场文书
小学四年级作文之写景
2019/08/23 职场文书
python爬虫请求库httpx和parsel解析库的使用测评
2021/05/10 Python