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解决字典中的值是列表问题的方法
Mar 04 Python
python的else子句使用指南
Feb 27 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
Apr 12 Python
python的构建工具setup.py的方法使用示例
Oct 23 Python
python实现可视化动态CPU性能监控
Jun 21 Python
Python逐行读取文件中内容的简单方法
Feb 26 Python
Django REST framework内置路由用法
Jul 26 Python
一文了解python 3 字符串格式化 F-string 用法
Mar 04 Python
音频处理 windows10下python三方库librosa安装教程
Jun 20 Python
Python图像处理二值化方法实例汇总
Jul 24 Python
python学习笔记之多进程
Aug 06 Python
Python如何使用logging为Flask增加logid
Mar 30 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简单命令代码集锦
2007/09/24 PHP
攻克CakePHP系列一 连接MySQL数据库
2008/10/22 PHP
PHP计划任务之关闭浏览器后仍然继续执行的函数
2010/07/22 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
2014/08/23 PHP
详解PHP数据压缩、加解密(pack, unpack)
2016/12/17 PHP
PHP常用的三种设计模式
2017/02/17 PHP
PHP获取类私有属性的3种方法
2020/09/10 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
讨论html与javascript在浏览器中的加载顺序问题
2013/11/27 Javascript
js中创建对象的几种方式示例介绍
2014/01/26 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
深入理解jquery的$.extend()、$.fn和$.fn.extend()
2017/07/08 jQuery
javascript流程控制语句集合
2017/09/18 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
小程序实现留言板
2018/11/02 Javascript
深入学习JavaScript 高阶函数
2019/06/11 Javascript
Vue实现商品分类菜单数量提示功能
2019/07/26 Javascript
[06:33]DOTA2亚洲邀请赛小组赛第二日 TOP10精彩集锦
2015/01/31 DOTA
python基础教程之基本内置数据类型介绍
2014/02/20 Python
Python 3.x 连接数据库示例(pymysql 方式)
2017/01/19 Python
Python做简单的字符串匹配详解
2017/03/21 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
django之静态文件 django 2.0 在网页中显示图片的例子
2019/07/28 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
2019/08/05 Python
如何分离django中的媒体、静态文件和网页
2019/11/12 Python
Python:slice与indices的用法
2019/11/25 Python
python如何实现读取并显示图片(不需要图形界面)
2020/07/08 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
eBay澳大利亚站:eBay.com.au
2018/02/02 全球购物
Gtech官方网站:地毯清洁器、吸尘器及园艺设备
2018/05/23 全球购物
介绍一下Ruby的多线程处理
2013/02/01 面试题
英语简历自我评价
2014/01/26 职场文书
《北京的春节》教学反思
2014/04/07 职场文书
留学经费担保书
2014/05/12 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书