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 相关文章推荐
JPype实现在python中调用JAVA的实例
Jul 19 Python
对pandas的dataframe绘图并保存的实现方法
Aug 05 Python
PyQt5每天必学之弹出消息框
Apr 19 Python
python Spyder界面无法打开的解决方法
Apr 27 Python
django中静态文件配置static的方法
May 20 Python
在双python下设置python3为默认的方法
Oct 31 Python
django认证系统 Authentication使用详解
Jul 22 Python
浅析Django中关于session的使用
Dec 30 Python
浅谈pytorch、cuda、python的版本对齐问题
Jan 15 Python
Python3内置函数chr和ord实现进制转换
Jun 05 Python
Python使用文件操作实现一个XX信息管理系统的示例
Jul 02 Python
Selenium webdriver添加cookie实现过程详解
Aug 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
PHP STRING 陷阱原理说明
2010/07/24 PHP
php URL跳转代码 减少外链
2011/06/25 PHP
PHP中获取变量的变量名的一段代码的bug分析
2011/07/07 PHP
PHP 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
PHP+redis实现添加处理投票的方法
2015/11/14 PHP
php文件管理基本功能简单操作
2017/01/16 PHP
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
JQuery写动态树示例代码
2013/07/31 Javascript
Javascript之String对象详解
2016/06/08 Javascript
Vuejs第八篇之Vuejs组件的定义实例解析
2016/09/05 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
Vue.js路由vue-router使用方法详解
2017/03/20 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
VUE2.0中Jsonp的使用方法
2018/05/22 Javascript
超轻量级的js时间库miment使用解析
2019/08/02 Javascript
Vue-cli3项目引入Typescript的实现方法
2019/10/18 Javascript
JS动态显示倒计时效果
2019/12/12 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
2020/03/06 Javascript
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
对Python的Django框架中的项目进行单元测试的方法
2016/04/11 Python
Python 递归函数详解及实例
2016/12/27 Python
spark: RDD与DataFrame之间的相互转换方法
2018/06/07 Python
python调用函数、类和文件操作简单实例总结
2019/11/29 Python
Python常用库大全及简要说明
2020/01/17 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
FirstCry阿联酋儿童和婴儿产品网上购物:FirstCry.ae
2021/02/22 全球购物
爱我中华演讲稿
2014/05/20 职场文书
服务承诺口号
2014/05/22 职场文书
现场活动策划方案
2014/08/22 职场文书
停车场管理协议书范本
2014/10/08 职场文书
2014年财务工作总结范文
2014/11/11 职场文书
2015年中秋晚会主持词
2015/07/01 职场文书
创业计划书之废品回收
2019/09/26 职场文书
MySQL数据库超时设置配置的方法实例
2021/10/15 MySQL
JavaScript模拟实现网易云轮播效果
2022/04/04 Javascript