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在不同层级目录import模块的方法
Jan 31 Python
用python实现简单EXCEL数据统计的实例
Jan 24 Python
Python编程二分法实现冒泡算法+快速排序代码示例
Jan 15 Python
简单谈谈python中的lambda表达式
Jan 19 Python
Python处理CSV与List的转换方法
Apr 19 Python
python如何查看微信消息撤回
Nov 27 Python
django多个APP的urls设置方法(views重复问题解决)
Jul 19 Python
Django 创建新App及其常用命令的实现方法
Aug 04 Python
Django中create和save方法的不同
Aug 13 Python
python 实现线程之间的通信示例
Feb 14 Python
导致python中import错误的原因是什么
Jul 01 Python
Python logging模块进行封装实现原理解析
Aug 07 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-redis中文文档介绍
2013/02/07 PHP
php读取文件内容的三种可行方法示例介绍
2014/02/08 PHP
项目中应用Redis+Php的场景
2016/05/22 PHP
详解php中空字符串和0之间的关系
2016/10/23 PHP
PHP自定义多进制的方法
2016/11/03 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
jquery实现excel导出的方法
2013/04/04 Javascript
php跨域调用json的例子
2013/11/13 Javascript
浅析javascript 定时器
2014/12/23 Javascript
原生js实现模拟滚动条
2015/06/15 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
2016/09/06 Javascript
详解Angular 4.x Injector
2017/05/04 Javascript
angularjs数组判断是否含有某个元素的实例
2018/02/27 Javascript
Vue中的transition封装组件的实现方法
2019/08/13 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
mpvue微信小程序开发之实现一个弹幕评论
2019/11/24 Javascript
使用numpy和PIL进行简单的图像处理方法
2018/07/02 Python
通过shell+python实现企业微信预警
2019/03/07 Python
python requests指定出口ip的例子
2019/07/25 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
2020/04/08 Python
Matlab中plot基本用法的具体使用
2020/07/17 Python
python 解决函数返回return的问题
2020/12/05 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
html5 sessionStorage会话存储_动力节点Java学院整理
2017/07/06 HTML / CSS
html5 Canvas画图教程(6)—canvas里画曲线之arcTo方法
2013/01/09 HTML / CSS
Madda Fella官网:美国冒险家服装品牌
2020/01/16 全球购物
Android面试宝典
2013/08/06 面试题
介绍一下EJB的分类及其各自的功能及应用
2016/08/23 面试题
美德好少年主要事迹
2014/01/29 职场文书
《再见了,亲人》教学反思
2014/02/26 职场文书
《英英学古诗》教学反思
2014/04/11 职场文书
公司财务会计主管应聘求职信
2014/09/26 职场文书
2014年医生工作总结
2014/11/21 职场文书
python实现的web监控系统
2021/04/27 Python
redis 查看所有的key方式
2021/05/07 Redis
gateway网关接口请求的校验方式
2021/07/15 Java/Android