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中条件选择和循环语句使用方法介绍
Mar 13 Python
python基于mysql实现的简单队列以及跨进程锁实例详解
Jul 07 Python
Python实现OpenCV的安装与使用示例
Mar 30 Python
Python子类继承父类构造函数详解
Feb 19 Python
使用python实现mqtt的发布和订阅
May 05 Python
Django后台admin的使用详解
Jul 08 Python
Python pip install如何修改默认下载路径
Apr 29 Python
python对execl 处理操作代码
Jun 22 Python
python用tkinter实现一个gui的翻译工具
Oct 26 Python
python中uuid模块实例浅析
Dec 29 Python
DRF使用simple JWT身份验证的实现
Jan 14 Python
python基础之类方法和静态方法
Oct 24 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调用Webservice实例代码
2011/07/29 PHP
php模板函数 正则实现代码
2012/10/15 PHP
解析php二分法查找数组是否包含某一元素
2013/05/23 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
2018/08/07 PHP
总结PHP中初始化空数组的最佳方法
2019/02/13 PHP
php-fpm中max_children的配置
2019/03/15 PHP
大家未必知道的Js技巧收藏
2008/04/07 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
2016/11/21 Javascript
详解js中Json的语法与格式
2016/11/22 Javascript
JS实现含有中文字符串的友好截取功能分析
2017/03/13 Javascript
IntersectionObserver实现图片懒加载的示例
2017/09/29 Javascript
基于匀速运动的实例讲解(侧边栏,淡入淡出)
2017/10/17 Javascript
微信小程序倒计时功能实现代码
2017/11/09 Javascript
vue中rem的配置的方法示例
2018/08/30 Javascript
layui输入框中只允许输入整数的实现方法
2019/09/18 Javascript
[01:54]TI珍贵瞬间系列(三):翻盘
2020/08/28 DOTA
简单谈谈Python中的反转字符串问题
2016/10/24 Python
浅谈用Python实现一个大数据搜索引擎
2017/11/28 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
python3实现163邮箱SMTP发送邮件
2018/05/22 Python
python实现小世界网络生成
2019/11/21 Python
后端开发使用pycharm的技巧(推荐)
2020/03/27 Python
python math模块的基本使用教程
2021/01/16 Python
网页切图的CSS和布局经验与要点
2015/04/09 HTML / CSS
欧洲有机婴儿食品最大的市场:Organic Baby Food(供美国和加拿大)
2018/03/28 全球购物
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
大学生党课思想汇报
2013/12/29 职场文书
团队拓展活动方案
2014/08/28 职场文书
农行心得体会
2014/09/02 职场文书
依法行政工作汇报
2014/10/28 职场文书
开业庆典致辞
2015/08/01 职场文书
导游词之南京莫愁湖公园
2019/11/13 职场文书