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 相关文章推荐
详细分析python3的reduce函数
Dec 05 Python
Python os.rename() 重命名目录和文件的示例
Oct 25 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
May 23 Python
python 多进程共享全局变量之Manager()详解
Aug 15 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 Python
python+selenium select下拉选择框定位处理方法
Aug 24 Python
利用Python绘制有趣的万圣节南瓜怪效果
Oct 31 Python
深入浅析python的第三方库pandas
Feb 13 Python
python利用百度云接口实现车牌识别的示例
Feb 21 Python
如何真正的了解python装饰器
Aug 14 Python
DRF使用simple JWT身份验证的实现
Jan 14 Python
用Python可视化新冠疫情数据
Jan 18 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
flash用php连接数据库的代码
2011/04/21 PHP
php对大文件进行读取操作的实现代码
2013/01/23 PHP
一个完整的PHP类包含的七种语法说明
2015/06/04 PHP
php函数传值的引用传递注意事项分析
2016/06/25 PHP
YII框架批量插入数据的方法
2017/03/18 PHP
javascript 主动派发事件总结
2011/08/09 Javascript
JS如何将UTC格式时间转本地格式
2013/09/04 Javascript
jQuery照片伸缩效果不影响其他元素的布局
2014/05/09 Javascript
jquery中获得元素尺寸和坐标的方法整理
2014/05/18 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
vue.js表格组件开发的实例详解
2016/10/12 Javascript
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
phantomjs导出html到pdf的方法总结
2017/10/19 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
vue 微信授权登录解决方案
2018/04/10 Javascript
基于vue的验证码组件的示例代码
2019/01/22 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
js实现浏览器打印功能的示例代码
2020/07/15 Javascript
vue.js 解决v-model让select默认选中不生效的问题
2020/07/28 Javascript
微信小程序轮播图swiper代码详解
2020/12/01 Javascript
[04:52]2015国际邀请赛LGD战队晋级之路
2015/08/14 DOTA
基于并发服务器几种实现方法(总结)
2017/12/29 Python
python多进程实现文件下载传输功能
2018/07/28 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
2021/01/06 Python
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
通信工程毕业生自荐信
2013/11/01 职场文书
文言文形式的学生求职信
2013/12/03 职场文书
我的大学生活职业生涯规划
2014/01/02 职场文书
《风娃娃》教学反思
2014/04/19 职场文书
负责人任命书范本
2014/06/04 职场文书
2014年科研工作总结
2014/12/03 职场文书
2015元旦联欢晚会结束语
2014/12/14 职场文书
乐山大佛导游词
2015/02/02 职场文书
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python
低门槛开发iOS、Android、小程序应用的前端框架详解
2021/10/16 Javascript