django 利用Q对象与F对象进行查询的实现


Posted in Python onMay 15, 2020

Q对象:

优势:可以实现 与|或|非 组合查询。

给几个小例子就一目了然了:

Book.objects.filter(id__gt=2,bread__gt=20) #and关系
Book.objects.filter(Q(bread__gt=20) & Q(id__gt=2)) #and关系
Book.objects.filter(Q(bread__gt=20) | Q(id__gt=2)) #or关系
Book.objects.filter.(~Q(id=3)) # ~表示not,查询编号不等于3的图书

F对象:

优势:能利用当前obj的值进行比较。

Book.objects.filter(bread__gt=F('bcomment')*2) #阅读量大于评论量的图书*2,可以在F对象上使用算术运算

以前你可能经常只进行Book.objects.filter(bread__gt=20)这样的查询 ,有了F对象你就可以和当前obj的属性值进行比较了。

实际开发中遇到的问题:

如果事情都按照示例那样进行就好了,然而开发中总会遇到一些坑。

比如下面这个是我实际开发中遇到的问题:

user = request.user
Interviewer.object.filter(Q(interviewer_1=user) | Q(interviewer_2=user) | Q(interviewer_3=user))

目的是想查一面或者二面或者三面的面试官包含user的面试。

其中interviewer_1、interviewer_2、interviewer_3是Interviewer表中的三个多对多字段的外键。

结果可能让意想不到,结果是一个包含多个重复值的查询集,置于为什么会重复,我并没用做深入调查,但是这在django ORM多表查询中会经常遇到,这就是网上说的一般的情况下,QuerySet 中不会出来重复的,重复是很罕见的,但是当跨越多张表进行检索后,结果并到一起,可能会出来重复的值。

那么要怎么解决这个问题呢?很简单,后面加个.distinct()作用就是去重。

user = request.user
Interviewer.object.filter(Q(interviewer_1=user) | Q(interviewer_2=user) | Q(interviewer_3=user)).distinct()

补充知识:Django中models利用ORM对Mysql进行查表的语句

一: all() 返回模型类对应表格中所有的数据。

二:get():返回表格中满足条件的一条数据,如果查到多条数据,则抛异常:MultipleObjectsReturned,查询不到数据,则抛异常:DoesNotExist。

三:filter():参数写查询条件,返回满足条件 QuerySet 集合数据。

条件格式:

“模型类属性名” __条件名=值(此处模型类属性名为model里面的属性名,不是数据库里面表的字段名)

1)判断是否存在

BookInfo.object.filter(id__exact=1)此处的__exact 可以省略

2)模糊查询

>查询书名包含传的图书

BookInfo.objects.filter(btitle__contains='传')

>查询书名不为空的图书

BookInfo.objects.filter(btitle__isnull=False)

>查询图书id在1,3,5的图书

BookInfo.objects.filter(id__in=[1,3,5])

>比较查询 gt lt(less than) gte(equal) lte

BookInfo.objects.filter(id__gte=3)

>日期查询

BookInfo.objects.filter(bpub_date__year = 1980)

BookInfo.objects.filter(bpub_date__gt = date(1980,1,1))

四、exclude()返回不满足条件的数据

BookInfo.objects.exclude(id=3)

五 F对象

作用:用于类属性之间的比较条件。

用法:

1:导入 from django.db.models import F

2 :举例 BookInfo.objects.filter(bread_gt = F('bcomment') (查询阅读量大于评论量的图书)

3: 举例 BookInfo.objects.filter(bread__gt=F(‘bcomment')*2) (查询阅读量等于2倍评论量的图书)

六 Q对象

作用:用于查询时的逻辑条件。可以对 Q 对象进行&|~操作。

用法:

1:导入 from django.db.models import Q

2: 举例:

BookInfo.objects.filter(id__gt=3,bread__gt=30) 和 Book.objects.filter(Q(id__gt=3)&Q(bread__gt=3))

3:举例:

BookInfo.objects.filter(Q(id__gt=3) | Q(bread__gt=30))

七 order_by 返回QuerySet

作用:对查询结果进行排序。

1:举例 BookInfo.object.all().order_by("id")[正序]

2:举例 BookInfo.object.all().order_by("-id")[倒序]

3:举例:BookInfo.objects.filter(id__gt=3).order_by('-bread')

以上这篇django 利用Q对象与F对象进行查询的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
基于Python的身份证号码自动生成程序
Aug 15 Python
Python模块搜索概念介绍及模块安装方法介绍
Jun 03 Python
Django 导出 Excel 代码的实例详解
Aug 11 Python
python按行读取文件,去掉每行的换行符\n的实例
Apr 19 Python
Python单元测试简单示例
Jul 03 Python
python3+django2开发一个简单的人员管理系统过程详解
Jul 23 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
Aug 20 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
Feb 17 Python
关于python3.9安装wordcloud出错的问题及解决办法
Nov 02 Python
详解Python利用configparser对配置文件进行读写操作
Nov 03 Python
Django一小时写出账号密码管理系统
Apr 29 Python
基于Python实现nc批量转tif格式
Aug 14 Python
Python实现电视里的5毛特效实例代码详解
May 15 #Python
python中wx模块的具体使用方法
May 15 #Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 #Python
python随机模块random的22种函数(小结)
May 15 #Python
将pymysql获取到的数据类型是tuple转化为pandas方式
May 15 #Python
python 数据库查询返回list或tuple实例
May 15 #Python
Python基于gevent实现高并发代码实例
May 15 #Python
You might like
PHP 动态随机生成验证码类代码
2010/04/09 PHP
PHP定时执行任务实现方法详解(Timer)
2015/07/30 PHP
Symfony实现行为和模板中取得request参数的方法
2016/03/17 PHP
thinkphp自带验证码全面解析
2016/09/18 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
json简单介绍
2008/06/10 Javascript
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
js+css使DIV始终居于屏幕中间 左下 左上 右上 右下的代码集合
2011/03/10 Javascript
jQuery实现打开页面渐现效果示例
2016/07/27 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
2017/08/15 jQuery
jQuery插件DataTables分页开发心得体会
2017/08/22 jQuery
OkHttp踩坑随笔为何 response.body().string() 只能调用一次
2018/01/08 Javascript
vue使用监听实现全选反选功能
2018/07/06 Javascript
JS在if中的强制类型转换方式
2018/07/15 Javascript
vue-cli脚手架的安装教程图解
2018/09/02 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
非常漂亮的js烟花效果
2020/03/10 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
利用 Monkey 命令操作屏幕快速滑动
2016/12/07 Python
Python检测网络延迟的代码
2018/05/15 Python
python贪吃蛇游戏代码
2020/04/18 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
Python 3 使用Pillow生成漂亮的分形树图片
2019/12/24 Python
Python 实现日志同时输出到屏幕和文件
2020/02/19 Python
Python接口测试文件上传实例解析
2020/05/22 Python
Pythonic版二分查找实现过程原理解析
2020/08/11 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
2020/12/03 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
2021/02/26 Python
HTML5 Web Database 数据库的SQL语句的使用方法
2012/12/09 HTML / CSS
Canvas系列之滤镜效果
2019/02/12 HTML / CSS
11月升旗仪式讲话稿
2014/02/15 职场文书
读书活动总结
2014/04/28 职场文书
安全施工责任书
2014/08/25 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书