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(Tornado)模拟登录小米抢手机
Nov 12 Python
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
May 23 Python
用Python制作在地图上模拟瘟疫扩散的Gif图
Mar 31 Python
详解Python Socket网络编程
Jan 05 Python
python扫描proxy并获取可用代理ip的实例
Aug 07 Python
tensorflow: variable的值与variable.read_value()的值区别详解
Jul 30 Python
Python对excel文档的操作方法详解
Dec 10 Python
python多线程调用exit无法退出的解决方法
Feb 18 Python
python函数定义和调用过程详解
Feb 09 Python
python MultipartEncoder传输zip文件实例
Apr 07 Python
Python使用re模块验证危险字符
May 21 Python
python如何提升爬虫效率
Sep 27 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 rsa加密解密使用方法
2015/04/27 PHP
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
JQuery异步加载PartialView的方法
2016/06/07 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
详解vue过滤器在v2.0版本用法
2017/06/01 Javascript
使用JQ完成表格隔行换色的简单实例
2017/08/25 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
2017/11/28 Javascript
VUEX-action可以修改state吗
2019/11/19 Javascript
Vue中keep-alive组件作用详解
2020/02/04 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
通过python顺序修改文件名字的方法
2018/07/11 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
使用python批量转换文件编码为UTF-8的实现
2020/04/03 Python
一个入门级python爬虫教程详解
2021/01/27 Python
css3实现背景图片拉伸效果像桌面壁纸一样
2013/08/19 HTML / CSS
荷兰街头时尚之家:Funkie House
2019/03/18 全球购物
客户代表自我评价范例
2013/09/24 职场文书
解除劳动关系协议书范文
2014/09/11 职场文书
拆迁委托协议书
2014/09/15 职场文书
副检察长四风问题对照检查材料思想汇报
2014/10/07 职场文书
教师批评与自我批评(群众路线)
2014/10/15 职场文书
群众路线专项整治方案
2014/10/27 职场文书
区域经理岗位职责
2015/02/02 职场文书
义卖募捐活动总结
2015/05/09 职场文书
道歉短信大全
2015/05/12 职场文书
2016教师暑期培训学习心得体会
2016/01/09 职场文书
Python中常见的导入方式总结
2021/05/06 Python
Python打包为exe详细教程
2021/05/18 Python
pytorch 实现变分自动编码器的操作
2021/05/24 Python
Java并发编程之Executor接口的使用
2021/06/21 Java/Android
使用python生成大量数据写入es数据库并查询操作(2)
2022/09/23 Python