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实现给字典添加条目的方法
Sep 25 Python
Python中字符编码简介、方法及使用建议
Jan 08 Python
TensorFlow安装及jupyter notebook配置方法
Sep 08 Python
python简单实现操作Mysql数据库
Jan 29 Python
tensorflow实现KNN识别MNIST
Mar 12 Python
python自动重试第三方包retrying模块的方法
Apr 24 Python
深入分析python中整型不会溢出问题
Jun 18 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
Feb 14 Python
解决python flask中config配置管理的问题
Jul 26 Python
Django实现WebSSH操作物理机或虚拟机的方法
Nov 06 Python
Python自动重新加载模块详解(autoreload module)
Apr 01 Python
Python爬虫入门教程01之爬取豆瓣Top电影
Jan 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写杨辉三角实例代码
2011/07/17 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
php通过递归方式复制目录和子目录的方法
2015/03/13 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
PHP数据分析引擎计算余弦相似度算法示例
2017/08/08 PHP
浅谈JavaScript中面向对象技术的模拟
2006/09/25 Javascript
javascript中typeof的使用示例
2013/12/19 Javascript
javascript实现确定和取消提示框效果
2015/07/10 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
深入浅析JavaScript中的Function类型
2016/07/09 Javascript
js中获取键盘事件的简单实现方法
2016/10/10 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
ES5学习教程之Array对象
2017/04/01 Javascript
Jquery EasyUI $.Parser
2017/06/02 jQuery
从对象列表中获取一个对象的方法,依据关键字和值
2017/09/20 Javascript
JS实现获取进今年第几天是周几的方法分析
2018/06/27 Javascript
jQuery表单校验插件validator使用方法详解
2020/02/18 jQuery
JS数组扁平化、去重、排序操作实例详解
2020/02/24 Javascript
Python创建模块及模块导入的方法
2015/05/27 Python
Python中操作符重载用法分析
2016/04/29 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
如何利用Anaconda配置简单的Python环境
2019/06/24 Python
浅谈Python小波分析库Pywavelets的一点使用心得
2019/07/09 Python
django连接oracle时setting 配置方法
2019/08/29 Python
Python函数式编程指南:对生成器全面讲解
2019/11/19 Python
Python任务自动化工具tox使用教程
2020/03/17 Python
python 实现简单的计算器(gui界面)
2020/11/11 Python
Python爬虫之Selenium实现关闭浏览器
2020/12/04 Python
Kathmandu新西兰官网:新西兰户外运动品牌
2019/07/27 全球购物
亚马逊海外购:亚马逊美国、英国、日本、德国直邮
2021/03/18 全球购物
简单介绍Object类的功能、常用方法
2013/10/02 面试题
实习护理工作自我评价
2013/09/25 职场文书
优秀社区干部事迹材料
2014/02/03 职场文书
求职简历自我评价范文
2015/03/10 职场文书
投诉信回复范文
2015/07/03 职场文书
《从现在开始》教学反思
2016/02/16 职场文书