Django中Q查询及Q()对象 F查询及F()对象用法


Posted in Python onJuly 09, 2020

Django Q/F

#1 环境

Python3.7.3

Django==2.0.6

#2 开始

#2.1 django F()表达式

每次获取times当前的值,再+1,这样需要将times值取出,存到内存中

obj = models.Test.objects.get(name="cox")
obj.times = obj.times + 1
obj.save()

虽然 obj.times = F(“times”) + 1

看起来像常规的Python为实例属性赋值,但实际上它是一个描述数据库上操作的SQL结构

当Django遇到要给F()实例,它会覆盖标准的Python运算符来创建一个封装的SQL表达式;在这个例子中,指示数据库增加由 obj.times 表示的数据库字段。

无论 obj.times 的值是或曾是什么,Python永远不需要知道?完全由数据库来处理。Python通过Django的F()类做的所有事情仅是参考某个字段创建SQL语法来描述操作。

obj = models.Test.objects.get(name="cox")
obj.times = F("times") + 1
obj.save()

因此,F()可以通过以下方式提供性能优势

直接在数据库中操作而不是python

减少一些操作所需的数据库查询次数

#2.2 F()操作在 obj.save() 后会持续存在

如果times的值是1,那么经过n次save()之后,times的值是2

obj = models.Test.objects.get(name="cox")
obj.times = obj.times + 1
obj.save()
obj.save()
obj.save()

如果times的值是1,那么经过n次save()之后,times的值是1+n,而不是2,就是因为F()操作在 obj.save() 后会持续存在

obj = models.Test.objects.get(name="cox")
obj.times = F("times") + 1
obj.save()
obj.save()
obj.save()

#2.3 F()再过滤(filter)中的使用

获取表中收入(input_price)大于支出(output_price)的数据

models.Test.objects.filter(input_price__gt=F("output_price"))

Django支持F()对象使用加、减、乘、除、取模和幂运算等算术操作,两个操作数可以是常数或F()对象

models.Test.objects.filter(input_price__gt=F("output_price")*2)

models.Test.objects.filter(input_price__gt=F("output_price")+F("output_price"))

你还可以在F()对象中使用双下划线标记来跨越关联关系。 带有双下划线的F()对象将引入任何需要的join 操作以访问关联的对象

models.Test.objects.filter(authors__name=F('blog__name'))

对于date 和date/time 字段,你可以给它们加上或减去一个timedelta对象

from datetime import timedelta

models.Test.objects.filter(mod_date__gt=F('pub_date') + timedelta(days=3))

#2.4 Django Q()表达式

当我们在查询的条件中需要组合条件时(例如两个条件“且”或者“或”)时。我们可以使用Q()查询对象

from django.db.models import Q
models.Author.objects.filter(Q(name="cox") | Q(name="Tom")) # 获取在Author表中,name等于cox和name等于cox的所有数据

models.Author.objects.filter(Q(name="cox") & Q(age=12))# 获取在Author表中,name等于cox并且age等于12的所有数据

#2.5 Q()传入条件查询

q1 = Q()
q1.connector = 'OR'
q1.children.append(('name', "cox"))
q1.children.append(('name', "Tom"))
q1.children.append(('name', "Jeck"))
  
models.Author.objects.filter(q1) # 在Author表中,name等于cox/Tom/Jeck的所有数据
con = Q()

q1 = Q()
q1.connector = 'OR'
q1.children.append(('name', "cox"))
q1.children.append(('name', "Tom"))
q1.children.append(('name', "Jeck"))

q2 = Q()
q2.connector = 'OR'
q2.children.append(('age', 12))

con.add(q1, 'AND')
con.add(q2, 'AND')

models.Author.objects.filter(con) # 在Author表中,name等于cox/Tom/Jeck的 并且 满足age等于12 的所有数据

#2.6 Q()非

在Q()语句中,~代表非

models.Author.objects.filter(~Q(name="cox")) # 获取在Author表中,name不等于cox的所有数据

补充知识:Django 中 Models 的 F()和 Q()函数

1、F() ---- 专门取对象中某列值的操作

F对象允许Django在未实际链接数据的情况下具有对数据库字段的值的引用。

通常情况下我们在更新数据时需要先从数据库里将原数据取出后方在内存里,然后编辑某些属性,最后提交。

all = BookInfo.objects.filter(auth="小明")
for b in all:
  price = b.price
  b.price = price + 10
  b.save
  
# 使用F对象来计算
BookInfo.objects.filter(auth="小明").update(price=F("price")+10)

2、Q() ---- 对对象的复杂查询

Q对象是Django对model查询中所使用的关键字参数进行封装后的一个对象。

Q对象可以通过 &(与)、 |(或)、 ~(非)运算来组合生成不同的Q对象,便于在查询操作中灵活地运用。

from django.db.models import Q
# 并且条件:与条件查询
models.User.objects.filter(条件1,条件2,条件n..)
models.User.objects.filter(Q(username='老王') & Q(userpass='admin'))

# 或者条件:或条件
models.User.objects.fliter(Q(username='老王') | Q(username='老李'))

# 取反条件
models.User.objects.filter(~Q(username='老王'))
models.User.objects.exclude(username='老王')

以上这篇Django中Q查询及Q()对象 F查询及F()对象用法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用IronPython把Python脚本集成到.NET程序中的教程
Mar 31 Python
实例讲解Python的函数闭包使用中应注意的问题
Jun 20 Python
在IPython中执行Python程序文件的示例
Nov 01 Python
python使用正则筛选信用卡
Jan 27 Python
Python列表(List)知识点总结
Feb 18 Python
Python实现的微信支付方式总结【三种方式】
Apr 13 Python
详解Python 函数如何重载?
Apr 23 Python
python读写Excel表格的实例代码(简单实用)
Dec 19 Python
详解python opencv、scikit-image和PIL图像处理库比较
Dec 26 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
Dec 31 Python
python 基于UDP协议套接字通信的实现
Jan 22 Python
matplotlib交互式数据光标mpldatacursor的实现
Feb 03 Python
在CentOS7下安装Python3教程解析
Jul 09 #Python
django 将自带的数据库sqlite3改成mysql实例
Jul 09 #Python
Python使用xlrd实现读取合并单元格
Jul 09 #Python
django ObjectDoesNotExist 和 DoesNotExist的用法
Jul 09 #Python
浅谈优化Django ORM中的性能问题
Jul 09 #Python
Python单元测试及unittest框架用法实例解析
Jul 09 #Python
python 抓取知乎指定回答下视频的方法
Jul 09 #Python
You might like
php FPDF类库应用实现代码
2009/03/20 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
2013/06/21 PHP
摘自织梦CMS的HTTP文件下载类
2015/08/08 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
2016/11/21 PHP
jQuery1.6 类型判断实现代码
2011/09/01 Javascript
页面图片浮动左右滑动效果的简单实现案例
2014/02/10 Javascript
使用ajax+jqtransform实现动态加载select
2014/12/01 Javascript
TypeScript 中接口详解
2015/06/19 Javascript
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
JavaScript易错知识点整理
2016/12/05 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
VUE预渲染及遇到的坑
2018/09/03 Javascript
angularJs复选框checkbox选中进行ng-show显示隐藏的方法
2018/10/08 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
2018/11/26 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
2019/04/10 Javascript
vue实现公告栏文字上下滚动效果的示例代码
2020/06/16 Javascript
微信小程序实现搜索框功能及踩过的坑
2020/06/19 Javascript
python执行使用shell命令方法分享
2017/11/08 Python
python实现自动网页截图并裁剪图片
2018/07/30 Python
Python Pandas数据中对时间的操作
2019/07/30 Python
详解Python中的正斜杠与反斜杠
2019/08/09 Python
python实现俄罗斯方块小游戏
2020/04/24 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
深入浅析Python代码规范性检测
2020/07/31 Python
西班牙香水和化妆品购物网站:Arenal Perfumerías
2019/03/01 全球购物
大学理论知识学习自我鉴定
2014/04/28 职场文书
奥巴马连任演讲稿
2014/05/15 职场文书
学生党员一帮一活动总结
2014/07/08 职场文书
房屋产权证明书
2014/10/15 职场文书
杭白菊导游词
2015/02/10 职场文书
2015新教师教学工作总结
2015/07/22 职场文书
python opencv通过按键采集图片源码
2021/05/20 Python
Redis Cluster 字段模糊匹配及删除
2021/05/27 Redis
基于python定位棋子位置及识别棋子颜色
2021/07/26 Python
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL
排查并解决Oracle sysaux表空间异常增长
2022/04/20 Oracle