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 相关文章推荐
Django 添加静态文件的两种实现方法(必看篇)
Jul 14 Python
Python 多线程的实例详解
Sep 07 Python
Python语言实现将图片转化为html页面
Dec 06 Python
Python实现的简单读写csv文件操作示例
Jul 12 Python
使用Flask集成bootstrap的方法
Jul 24 Python
快速排序的四种python实现(推荐)
Apr 03 Python
python多线程同步实例教程
Aug 11 Python
Python解压 rar、zip、tar文件的方法
Nov 19 Python
Python彻底删除文件夹及其子文件方式
Dec 23 Python
Python hashlib模块实例使用详解
Dec 24 Python
Python通过正则库爬取淘宝商品信息代码实例
Mar 02 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
Oct 18 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
当海贼王变成JOJO风
2020/03/02 日漫
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
php利用事务处理转账问题
2015/04/22 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
Codeigniter中集成smarty和adodb的方法
2016/03/04 PHP
PHP 5.6.11中CURL模块问题的解决方法
2016/08/08 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
基于jquery animate操作css样式属性小结
2015/11/27 Javascript
Vuex之理解Store的用法
2017/04/19 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
jQuery封装placeholder效果实现方法,让低版本浏览器支持该效果
2017/07/08 jQuery
vue实现页面切换滑动效果
2020/06/29 Javascript
vue绑定class的三种方法
2020/12/24 Vue.js
python实现批量下载新浪博客的方法
2015/06/15 Python
python学习 流程控制语句详解
2016/06/01 Python
实用自动化运维Python脚本分享
2018/06/04 Python
python使用__slots__让你的代码更加节省内存
2018/09/05 Python
Python实现程序判断季节的代码示例
2019/01/28 Python
Django Form and ModelForm的区别与使用
2019/12/06 Python
Python控制鼠标键盘代码实例
2020/12/08 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
2021/01/12 Python
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
您的时尚,您的生活方式:DTLR Villa
2019/12/25 全球购物
农村婚礼证婚词
2014/01/10 职场文书
自我反省检讨书
2014/01/23 职场文书
行政文秘岗位职责范本
2014/02/10 职场文书
小学安全教育材料
2014/02/17 职场文书
农村婚庆司仪主持词
2014/03/15 职场文书
反邪教警示教育方案
2014/05/13 职场文书
酒店管理毕业生自荐信
2014/05/25 职场文书
2014年重阳节活动策划方案书
2014/09/16 职场文书
城市轨道交通工程职业生涯规划书范文
2014/09/16 职场文书
县人大领导班子四风对照检查材料思想汇报
2014/10/09 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
导游词之广西漓江
2019/11/02 职场文书