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通过ftplib登录到ftp服务器的方法
May 08 Python
Python中利用sqrt()方法进行平方根计算的教程
May 15 Python
Python探索之URL Dispatcher实例详解
Oct 28 Python
Python实现的多项式拟合功能示例【基于matplotlib】
May 15 Python
详解python 注释、变量、类型
Aug 10 Python
python散点图实例之随机漫步
Aug 27 Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 Python
Python面向对象之类和实例用法分析
Jun 08 Python
python性能测量工具cProfile使用解析
Sep 26 Python
pandas 空数据处理方法详解
Nov 02 Python
python获取时间戳的实现示例(10位和13位)
Sep 23 Python
Github 使用python对copilot做些简单使用测试
Apr 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与MySQL开发中页面出现乱码的一种解决方法
2007/07/29 PHP
AJAX的使用方法详解
2017/04/29 PHP
用js实现的自定义的对话框的实现代码
2010/03/21 Javascript
登陆成功后自动计算秒数执行跳转
2014/01/23 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
JavaScript给按钮绑定点击事件(onclick)的方法
2015/04/07 Javascript
js如何实现点击标签文字,文字在文本框出现
2015/08/05 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
JS获取字符串实际长度(包含汉字)的简单方法
2016/08/11 Javascript
响应式表格之固定表头的简单实现
2016/08/26 Javascript
Vue.js双向绑定实现原理详解
2016/12/22 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
javascript实现table单元格点击展开隐藏效果(实例代码)
2017/04/10 Javascript
layui实现文件或图片上传记录
2018/08/28 Javascript
Vue中img的src是动态渲染时不显示的解决
2019/11/14 Javascript
React.js组件实现拖拽排序组件功能过程解析
2020/04/27 Javascript
Element InputNumber 计数器的实现示例
2020/08/03 Javascript
[02:46]2014DOTA2国际邀请赛 选手为你解读比赛MVP充满梦想
2014/07/09 DOTA
python分割和拼接字符串
2013/11/01 Python
Python解析网页源代码中的115网盘链接实例
2014/09/30 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
2017/11/17 Python
python 构造三维全零数组的方法
2018/11/12 Python
python版DDOS攻击脚本
2019/06/12 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
2020/01/17 Python
如何利用find命令查找文件
2016/11/18 面试题
2014年道德讲堂实施方案
2014/03/05 职场文书
优秀德育工作者事迹材料
2014/05/07 职场文书
企业演讲稿范文大全
2014/05/20 职场文书
机关作风建设心得体会
2014/10/22 职场文书
社区综治工作汇报
2014/10/27 职场文书
2014年小学工作总结
2014/11/26 职场文书
信息技术国培研修日志
2015/11/13 职场文书
浅谈vue2的$refs在vue3组合式API中的替代方法
2021/04/18 Vue.js
如何解决.cuda()加载用时很长的问题
2021/05/24 Python
使用CSS3实现按钮悬停闪烁动态特效代码
2021/08/30 HTML / CSS