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 相关文章推荐
Linux下用Python脚本监控目录变化代码分享
May 21 Python
python连接mysql实例分享
Oct 09 Python
神经网络理论基础及Python实现详解
Dec 15 Python
python 遍历列表提取下标和值的实例
Dec 25 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
Jun 28 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
Aug 05 Python
Python目录和文件处理总结详解
Sep 02 Python
python读写Excel表格的实例代码(简单实用)
Dec 19 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
Dec 07 Python
python 对象真假值的实例(哪些视为False)
Dec 11 Python
python通用数据库操作工具 pydbclib的使用简介
Dec 21 Python
Jupyter Notebook内使用argparse报错的解决方案
Jun 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+Html+缓存
2006/11/25 PHP
基于HTTP长连接的"服务器推"技术的php 简易聊天室
2009/10/31 PHP
php读取文件内容的三种可行方法示例介绍
2014/02/08 PHP
使用phpQuery获取数组的实例
2017/03/13 PHP
PHP迭代器和生成器用法实例分析
2019/09/28 PHP
prototype1.4中文手册
2006/09/22 Javascript
extjs form textfield的隐藏方法
2008/12/29 Javascript
关于setInterval、setTimeout在jQuery中的使用注意事项
2011/09/28 Javascript
js模拟点击事件实现代码
2012/11/06 Javascript
详解jQuery Mobile自定义标签
2016/01/06 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
ES6入门教程之Class和Module详解
2017/05/17 Javascript
详解JS构造函数中this和return
2017/09/16 Javascript
JavaScript实现二叉树定义、遍历及查找的方法详解
2017/12/20 Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
2018/03/26 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
[02:03]DOTA2亚洲邀请赛 HGT战队出场宣传片
2015/02/07 DOTA
Python对List中的元素排序的方法
2018/04/01 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
2019/12/25 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
Python单元测试及unittest框架用法实例解析
2020/07/09 Python
基于python实现操作redis及消息队列
2020/08/27 Python
容易被忽略的Python内置类型
2020/09/03 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
在C语言中"指针和数组等价"到底是什么意思?
2014/03/24 面试题
促销活动总结范文
2014/04/30 职场文书
2014年信用社工作总结
2014/11/25 职场文书
捐款通知怎么写
2015/04/24 职场文书
晚会开场白和结束语
2015/05/29 职场文书
《我和小伙伴》教学反思
2016/02/20 职场文书
nginx前后端同域名配置的方法实现
2021/03/31 Servers
Python中的xlrd模块使用整理
2021/06/15 Python
MongoDB连接数据库并创建数据等使用方法
2021/11/27 MongoDB
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL