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编程效率
Feb 16 Python
梯度下降法介绍及利用Python实现的方法示例
Jul 12 Python
Python读取图片为16进制表示简单代码
Jan 19 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
Apr 02 Python
python实现随机调用一个浏览器打开网页
Apr 21 Python
Python File(文件) 方法整理
Feb 18 Python
numpy.random模块用法总结
May 27 Python
如何使用python操作vmware
Jul 27 Python
Django模板语言 Tags使用详解
Sep 09 Python
python字符串的拼接方法总结
Nov 18 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
Feb 04 Python
关于的python五子棋的算法
May 02 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 skymvc 一款轻量、简单的php
2011/06/28 PHP
php数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
Php Ctemplate引擎开发相关内容
2012/03/03 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
Laravel如何实现适合Api的异常处理响应格式
2020/06/14 PHP
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
2013/03/24 Javascript
JavaScript 32位整型无符号操作示例
2013/12/08 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
2015/03/01 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
JavaScript中apply方法的应用技巧小结
2016/09/29 Javascript
JavaScript设计模型Iterator实例解析
2020/01/22 Javascript
Vue实现剪切板图片压缩功能
2020/02/04 Javascript
[01:51]2014DOTA2国际邀请赛 这个赛场没有失败者VGTi5再见
2014/07/23 DOTA
[05:24]TI9采访——教练
2019/08/24 DOTA
python 算法 排序实现快速排序
2012/06/05 Python
python两种遍历字典(dict)的方法比较
2014/05/29 Python
python检查字符串是否是正确ISBN的方法
2015/07/11 Python
python3实现读取chrome浏览器cookie
2016/06/19 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
2019/08/23 Python
python 操作hive pyhs2方式
2019/12/21 Python
python 弧度与角度互转实例
2020/04/15 Python
美国一家专业的太阳镜网上零售商:Solstice太阳镜
2016/07/25 全球购物
德国机车企业:FC-Moto
2017/10/27 全球购物
NYX Professional Makeup官方网站:专业彩妆和美容产品
2019/10/29 全球购物
美容师的职业规划书
2013/12/27 职场文书
公司开业庆典主持词
2014/03/21 职场文书
保护动物的标语
2014/06/11 职场文书
计划生育标语
2014/06/23 职场文书
学校纪律作风整改措施思想汇报
2014/10/11 职场文书
学校运动会广播稿
2014/10/11 职场文书
校友回访母校寄语
2015/02/26 职场文书
大学生社区义工服务心得体会
2016/01/22 职场文书
漫改真人电影「萌系男友是燃燃的橘色」公开先导视觉图
2022/03/21 日漫
浅谈Vue的computed计算属性
2022/03/21 Vue.js