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中super的用法实例
May 28 Python
Python yield 使用浅析
May 28 Python
Python 爬虫多线程详解及实例代码
Oct 08 Python
python入门基础之用户输入与模块初认识
Nov 14 Python
python验证码识别的示例代码
Sep 21 Python
Python生成8位随机字符串的方法分析
Dec 05 Python
python获取酷狗音乐top500的下载地址 MP3格式
Apr 17 Python
Python txt文件加入字典并查询的方法
Jan 15 Python
python如何爬取网站数据并进行数据可视化
Jul 08 Python
python实现多线程端口扫描
Aug 31 Python
使用TensorFlow搭建一个全连接神经网络教程
Feb 06 Python
pandas按照列的值排序(某一列或者多列)
Dec 13 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中通过smtp发邮件的类,测试通过
2007/01/22 PHP
mysql 字段类型说明
2007/04/27 PHP
PHP常用的文件操作函数经典收藏
2013/04/02 PHP
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
php使用异或实现的加密解密实例
2013/09/04 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
php无限级分类实现评论及回复功能
2019/02/18 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
jQuery学习笔记(4)--Jquery中获取table中某列值的具体思路
2013/04/10 Javascript
JS调用页面表格导出excel示例代码
2014/03/18 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
ES6中如何使用Set和WeakSet
2016/03/10 Javascript
jQuery插件uploadify实现ajax效果的图片上传
2016/06/18 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
Vue项目中使用better-scroll实现菜单映射功能方法
2019/09/11 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
2019/11/11 Javascript
彻底搞懂并解决vue-cli4中图片显示的问题实现
2020/08/31 Javascript
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
[38:39]完美世界DOTA2联赛循环赛 IO vs GXR BO2第二场 11.04
2020/11/05 DOTA
浅谈Python 中整型对象的存储问题
2016/05/16 Python
Python使用django框架实现多人在线匿名聊天的小程序
2017/11/29 Python
Python Django路径配置实现过程解析
2020/11/05 Python
利用CSS3实现文字折纸效果实例代码
2018/07/10 HTML / CSS
AmazeUI框架搭建的方法步骤(图文)
2020/08/17 HTML / CSS
捷克玩具商店:Bambule
2019/02/23 全球购物
毕业生找工作推荐信
2013/11/21 职场文书
实习生自我评价
2014/01/18 职场文书
技术合作协议书范本
2014/04/18 职场文书
《恐龙》教学反思
2014/04/27 职场文书
党员民主生活会整改措施
2014/09/26 职场文书
2014年体育教学工作总结
2014/12/09 职场文书
党校个人总结
2015/03/04 职场文书
班主任工作经验交流会总结
2015/11/02 职场文书
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/04/22 无线电
css position fixed 左右双定位的实现代码
2021/04/29 HTML / CSS