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正则表达式re模块详解
Jun 25 Python
Python的垃圾回收机制深入分析
Jul 16 Python
浅谈function(函数)中的动态参数
Apr 30 Python
Python中异常重试的解决方案详解
May 05 Python
Python+OpenCV目标跟踪实现基本的运动检测
Jul 10 Python
PyQt4实时显示文本内容GUI的示例
Jun 14 Python
基于python3抓取pinpoint应用信息入库
Jan 08 Python
Tensorflow 多线程设置方式
Feb 06 Python
python爬虫实现获取下一页代码
Mar 13 Python
Django ORM filter() 的运用详解
May 14 Python
解决python图像处理图像赋值后变为白色的问题
Jun 04 Python
一篇文章带你搞懂Python类的相关知识
May 20 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扩展php_curl.dll不加载的解决方法
2013/06/26 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
2012/02/03 Javascript
ajax上传时参数提交不更新等相关问题
2012/12/11 Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
2014/01/10 Javascript
express的中间件cookieParser详解
2014/12/04 Javascript
javascript 操作符(~、&、|、^、)使用案例
2014/12/31 Javascript
jQuery中animate动画第二次点击事件没反应
2015/05/07 Javascript
jQuery往textarea中光标所在位置插入文本的方法
2015/06/26 Javascript
js钢琴按钮波浪式图片排列效果代码分享
2015/08/26 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
2017/04/20 jQuery
解决ionic和angular上拉加载的问题
2017/08/03 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
JavaScript实现表单注册、表单验证、运算符功能
2018/10/15 Javascript
angular 服务随记小结
2019/05/06 Javascript
gulp构建小程序的方法步骤
2019/05/31 Javascript
js实现拖动缓动效果
2020/01/13 Javascript
JS定时器如何实现提交成功提示功能
2020/06/12 Javascript
vue实现匀速轮播效果
2020/06/29 Javascript
Python交换变量
2008/09/06 Python
使用相同的Apache实例来运行Django和Media文件
2015/07/22 Python
python批量从es取数据的方法(文档数超过10000)
2018/12/27 Python
对python3中的RE(正则表达式)-详细总结
2019/07/23 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
协程Python 中实现多任务耗资源最小的方式
2020/10/19 Python
HTML5 本地存储 LocalStorage详解
2016/06/24 HTML / CSS
如何提高MySql的安全性
2014/06/19 面试题
团工委书记自荐书范文
2013/12/17 职场文书
有趣的广告词
2014/03/18 职场文书
另类冲刺标语
2014/06/24 职场文书
常务副县长“三严三实”对照检查材料思想汇报
2014/10/05 职场文书
公务员党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
大学生党性分析材料
2014/12/19 职场文书
狮子林导游词
2015/02/03 职场文书
Java完整实现记事本代码
2022/06/16 Java/Android