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 16 Python
Python中使用Queue和Condition进行线程同步的方法
Jan 19 Python
Python在Console下显示文本进度条的方法
Feb 14 Python
总结python实现父类调用两种方法的不同
Jan 15 Python
用Python将IP地址在整型和字符串之间轻松转换
Mar 22 Python
python机器学习理论与实战(二)决策树
Jan 19 Python
Python Learning 列表的更多操作及示例代码
Aug 22 Python
Tensorflow使用支持向量机拟合线性回归
Sep 07 Python
python re库的正则表达式入门学习教程
Mar 08 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
Oct 24 Python
Python开发企业微信机器人每天定时发消息实例
Mar 17 Python
Python捕获异常堆栈信息的几种方法(小结)
May 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
php判断GIF图片是否为动画的方法
2020/09/04 PHP
PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
2014/09/24 PHP
PHP使用flock实现文件加锁的方法
2015/07/01 PHP
php实现html标签闭合检测与修复方法
2015/07/09 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
2014/01/09 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
jQuery实现公告新闻自动滚屏效果实例代码
2016/07/14 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
JavaScript学习笔记--常用的互动方法
2016/12/07 Javascript
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
vue 使用vue-i18n做全局中英文切换的方法
2018/10/29 Javascript
echarts实现词云自定义形状的示例代码
2019/02/20 Javascript
详解webpack-dev-middleware 源码解读
2020/03/23 Javascript
JQuery插件tablesorter表格排序实现过程解析
2020/05/28 jQuery
python中类的一些方法分析
2014/09/25 Python
wxPython窗口中文乱码解决方法
2014/10/11 Python
Python实现获取命令行输出结果的方法
2017/06/10 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
基于python实现操作git过程代码解析
2020/07/27 Python
python 如何上传包到pypi
2020/12/24 Python
HTML5引入的新数组TypedArray介绍
2012/12/24 HTML / CSS
联想英国官网:Lenovo英国
2019/07/17 全球购物
公司庆典邀请函范文
2014/01/13 职场文书
婚纱摄影师求职信范文
2014/04/17 职场文书
电教室标语
2014/06/20 职场文书
党员检讨书
2014/10/13 职场文书
房产分割协议书范文
2014/11/21 职场文书
店铺转让协议书
2014/12/02 职场文书
2015个人简历自我评价语
2015/03/11 职场文书
2015年高中班级工作总结
2015/07/21 职场文书
导游词之阆中古城
2019/12/23 职场文书