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单链表的简单实现方法
Sep 23 Python
在Python中使用poplib模块收取邮件的教程
Apr 29 Python
Python中shutil模块的常用文件操作函数用法示例
Jul 05 Python
python批量修改文件夹及其子文件夹下的文件内容
Mar 15 Python
matplotlib实现区域颜色填充
Mar 18 Python
selenium跳过webdriver检测并模拟登录淘宝
Jun 12 Python
通过pycharm使用git的步骤(图文详解)
Jun 13 Python
django的聚合函数和aggregate、annotate方法使用详解
Jul 23 Python
Python 字符串、列表、元组的截取与切片操作示例
Sep 17 Python
python base64库给用户名或密码加密的流程
Jan 02 Python
python实现简单俄罗斯方块
Mar 13 Python
Python实现仓库管理系统
May 30 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(7) php 字符串相关应用
2010/03/05 PHP
Laravel框架执行原生SQL语句及使用paginate分页的方法
2018/08/17 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
2010/03/23 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
2011/06/27 Javascript
jquery中.add()的使用分析
2013/04/26 Javascript
js 程序执行与顺序实现详解
2013/05/13 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
2013/10/28 Javascript
jquery实现滑屏大图定时收缩为小banner图片的广告代码
2015/09/02 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
JavaScript简单生成 N~M 之间随机数的方法
2017/01/13 Javascript
vue父子组件的嵌套的示例代码
2017/09/08 Javascript
详解vue axios中文文档
2017/09/12 Javascript
详解js的作用域、预解析机制
2018/02/05 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
vue打包之后生成一个配置文件修改接口的方法
2018/12/09 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
2020/04/10 Javascript
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
Linux下为不同版本python安装第三方库
2016/08/31 Python
python Pygame的具体使用讲解
2017/11/03 Python
酷! 程序员用Python带你玩转冲顶大会
2018/01/17 Python
PyQt5每天必学之工具提示功能
2018/04/19 Python
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
Python关于__name__属性的含义和作用详解
2020/02/19 Python
Keras自定义IOU方式
2020/06/10 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
详解Django中异步任务之django-celery
2020/11/05 Python
JD Sports瑞典:英国领先的运动时尚商店
2018/01/28 全球购物
《小蝌蚪找妈妈》教学反思
2014/02/21 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书
红十字会救护培训简讯
2015/07/20 职场文书
python如何进行基准测试
2021/04/26 Python
世界十大狙击步枪排行榜
2022/03/20 杂记