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 相关文章推荐
使用python编写脚本获取手机当前应用apk的信息
Jul 21 Python
在Python中操作字符串之rstrip()方法的使用
May 19 Python
Python实现比较两个列表(list)范围
Jun 12 Python
利用Python中的pandas库对cdn日志进行分析详解
Mar 07 Python
pytorch cnn 识别手写的字实现自建图片数据
May 20 Python
Python 实现输入任意多个数,并计算其平均值的例子
Jul 16 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
Sep 07 Python
基于Python执行dos命令并获取输出的结果
Dec 30 Python
python实现查找所有程序的安装信息
Feb 18 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
Feb 20 Python
FP-growth算法发现频繁项集——构建FP树
Jun 24 Python
Pillow图像处理库安装及使用
Apr 12 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中的extract的作用分析
2008/04/09 PHP
域名和cookie问题(域名后缀)
2012/10/10 PHP
PHP永久登录、记住我功能实现方法和安全做法
2015/04/27 PHP
PHP中Session可能会引起并发问题
2015/06/26 PHP
基于命令行执行带参数的php脚本并取得参数的方法
2016/01/25 PHP
CI框架的安全性分析
2016/05/18 PHP
PHP精确到毫秒秒杀倒计时实例详解
2019/03/14 PHP
js location.replace与location.reload的区别
2010/09/08 Javascript
JavaScript arguments 多参传值函数
2010/10/24 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
js将json格式的对象拼接成复杂的url参数方法
2016/05/25 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
JS与CSS3实现图片响应鼠标移动放大效果示例
2018/05/04 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
一篇不错的Python入门教程
2007/02/08 Python
python 动态获取当前运行的类名和函数名的方法
2014/04/15 Python
Linux下Python获取IP地址的代码
2014/11/30 Python
python字典get()方法用法分析
2015/04/17 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
2017/07/11 Python
Python快速排序算法实例分析
2017/11/29 Python
快速了解Python开发中的cookie及简单代码示例
2018/01/17 Python
用python处理MS Word的实例讲解
2018/05/08 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
2018/07/11 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
2019/08/20 Python
python性能测试工具locust的使用
2020/12/28 Python
校班主任推荐信范文
2013/12/03 职场文书
医药代表个人的求职信分享
2013/12/08 职场文书
小学门卫岗位职责
2013/12/17 职场文书
商铺租赁意向书
2014/04/01 职场文书
租房协议书范本
2014/04/09 职场文书
歌唱比赛策划方案
2014/06/06 职场文书
2014年双拥工作总结
2014/11/21 职场文书
公司处罚决定书
2015/06/24 职场文书
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL
MySQL常用慢查询分析工具详解
2022/08/14 MySQL