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动态监控日志内容的示例
Feb 16 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
Nov 23 Python
python处理csv数据动态显示曲线实例代码
Jan 23 Python
python使用xslt提取网页数据的方法
Feb 23 Python
Pandas DataFrame 取一行数据会得到Series的方法
Nov 10 Python
Django使用Channels实现WebSocket的方法
Jul 28 Python
Python实现Restful API的例子
Aug 31 Python
使用Rasterio读取栅格数据的实例讲解
Nov 26 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
May 08 Python
python能做哪方面的工作
Jun 15 Python
python中的装饰器该如何使用
Jun 18 Python
Python re.sub 反向引用的实现
Jul 07 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防止跨域提交表单
2013/11/01 PHP
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
JS 控制小数位数的实现代码
2011/08/02 Javascript
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
jQuery设置div一直在页面顶部显示的方法
2013/10/24 Javascript
javascript操作excel生成报表示例
2014/05/08 Javascript
js简单实现点击左右运动的方法
2015/04/10 Javascript
浅谈Node.js中的定时器
2015/06/18 Javascript
JavaScript动态生成二维码图片
2016/04/20 Javascript
jQuery事件绑定用法详解
2016/09/08 Javascript
JS实现物体带缓冲的间歇运动效果示例
2016/12/22 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
2017/03/15 Javascript
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
JavaScript实现简单动态进度条效果
2018/04/06 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
2018/05/22 Javascript
详解Vue项目部署遇到的问题及解决方案
2019/01/11 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
微信小程序实现下拉刷新动画
2019/06/21 Javascript
JavaScript获取时区实现过程解析
2020/09/24 Javascript
[03:09]DOTA2亚洲邀请赛 LGD战队出场宣传片
2015/02/07 DOTA
在Python中使用itertools模块中的组合函数的教程
2015/04/13 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
python实现狄克斯特拉算法
2019/01/17 Python
python的数学算法函数及公式用法
2020/11/18 Python
python excel多行合并的方法
2020/12/09 Python
HTML5微信播放全屏问题的解决方法
2017/03/09 HTML / CSS
俄罗斯游戏商店:Buka
2020/03/01 全球购物
IBatis持久层技术
2016/07/18 面试题
本科毕业生应聘自荐信范文
2014/06/26 职场文书
小学数学教研活动总结
2014/07/01 职场文书
2014年艾滋病防治工作总结
2014/12/10 职场文书
英语投诉信范文
2015/07/03 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
教学副校长工作总结
2015/08/13 职场文书
Vue全局事件总线你了解吗
2022/02/24 Vue.js