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 pdb调试方法分享
Jan 21 Python
Python 列表list使用介绍
Nov 30 Python
使用Protocol Buffers的C语言拓展提速Python程序的示例
Apr 16 Python
Python中的zipfile模块使用详解
Jun 25 Python
python实现文件快照加密保护的方法
Jun 30 Python
python如何在终端里面显示一张图片
Aug 17 Python
Python使用正则表达式抓取网页图片的方法示例
Apr 21 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
Apr 27 Python
python的scipy实现插值的示例代码
Nov 12 Python
python数值基础知识浅析
Nov 19 Python
使用python从三个角度解决josephus问题的方法
Mar 27 Python
python怎么对数字进行过滤
Jul 05 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使用适合阅读的格式显示文件大小的方法
2015/03/05 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
CakePHP框架Session设置方法分析
2017/02/23 PHP
ThinkPHP删除栏目(实现批量删除栏目)
2017/06/21 PHP
一个javascript参数的小问题
2008/03/02 Javascript
jQuery生成asp.net服务器控件的代码
2010/02/04 Javascript
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
js局部刷新页面时间具体实现
2013/07/04 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
2013/10/29 Javascript
在每个匹配元素的外部插入新元素的方法
2013/12/20 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
jQuery+ajax中getJSON() 用法实例
2014/12/22 Javascript
JavaScript中的Math.sin()方法使用详解
2015/06/15 Javascript
jQuery+PHP+MySQL二级联动下拉菜单实例讲解
2015/10/27 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
NodeJs读取JSON文件格式化时的注意事项
2016/09/25 NodeJs
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
完美实现js选项卡切换效果(一)
2017/03/08 Javascript
从vue源码看props的用法
2019/01/09 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
详解Element-UI中上传的文件前端处理
2019/08/07 Javascript
python用ConfigObj读写配置文件的实现代码
2013/03/04 Python
Python跨文件全局变量的实现方法示例
2017/12/10 Python
python django 原生sql 获取数据的例子
2019/08/14 Python
pytorch 实现查看网络中的参数
2020/01/06 Python
AmazeUI 折叠面板的实现代码
2020/08/17 HTML / CSS
出国导师推荐信
2014/01/16 职场文书
数学兴趣小组活动总结
2014/07/08 职场文书
运动会闭幕词
2015/01/28 职场文书
学生逃课检讨书
2015/02/17 职场文书
2015年感恩母亲节活动方案
2015/05/04 职场文书
美丽人生观后感
2015/06/03 职场文书
安全温馨提示语大全
2015/07/14 职场文书
担保书范文
2019/07/09 职场文书
源码解读Spring-Integration执行过程
2021/06/11 Java/Android