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获取CPU和内存信息的思路与实现(linux系统)
Jan 03 Python
linux系统使用python获取内存使用信息脚本分享
Jan 15 Python
python求列表交集的方法汇总
Nov 10 Python
Python学习笔记之解析json的方法分析
Apr 21 Python
python实现识别手写数字 python图像识别算法
Mar 23 Python
Django中Model的使用方法教程
Mar 07 Python
在python中获取div的文本内容并和想定结果进行对比详解
Jan 02 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
May 07 Python
python五子棋游戏的设计与实现
Jun 18 Python
Python3如何实现Win10桌面自动切换
Aug 11 Python
pandas apply多线程实现代码
Aug 17 Python
python 监控服务器是否有人远程登录(详细思路+代码)
Dec 18 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
使用Limit参数优化MySQL查询的方法
2008/11/12 PHP
php模仿asp Application对象在线人数统计实现方法
2015/01/04 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
js之事件冒泡和事件捕获详细介绍
2013/10/28 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
2015/08/24 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
2017/01/19 Javascript
理解 Node.js 事件驱动机制的原理
2017/08/16 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
2017/10/24 Javascript
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
深入浅析var,let,const的异同点
2018/08/07 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
python中zip和unzip数据的方法
2015/05/27 Python
Python中import导入上一级目录模块及循环import问题的解决
2016/06/04 Python
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
2019/08/02 Python
Python FTP文件定时自动下载实现过程解析
2019/11/12 Python
安装PyInstaller失败问题解决
2019/12/14 Python
python文件和文件夹复制函数
2020/02/07 Python
如何利用Python动态模拟太阳系运转
2020/09/04 Python
python打包多类型文件的操作方法
2020/09/21 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
python生成word合同的实例方法
2021/01/12 Python
ProBikeKit德国:在线公路自行车专家
2018/06/03 全球购物
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
优质有机椰子产品:Dr. Goerg
2019/09/24 全球购物
儿子婚宴答谢词
2014/01/09 职场文书
2014年高一班主任工作总结
2014/12/05 职场文书
先进学校事迹材料
2014/12/30 职场文书
个人廉洁自律总结
2015/03/06 职场文书
导游词之山东孔庙
2019/11/04 职场文书
JS如何实现基于websocket的多端桥接平台
2021/05/14 Javascript
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP