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根据路径导入模块的方法
Sep 30 Python
Python的Django框架可适配的各种数据库介绍
Jul 15 Python
Python中类型检查的详细介绍
Feb 13 Python
浅谈python和C语言混编的几种方式(推荐)
Sep 27 Python
在PyCharm导航区中打开多个Project的关闭方法
Jan 17 Python
python简单验证码识别的实现方法
May 10 Python
Python+PyQT5的子线程更新UI界面的实例
Jun 14 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
Jun 18 Python
Pytorch to(device)用法
Jan 08 Python
Python切割图片成九宫格的示例代码
Mar 10 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
Apr 30 Python
python 使用三引号时容易犯的小错误
Oct 21 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
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
PHP 获取远程文件内容的函数代码
2010/03/24 PHP
如何用phpmyadmin设置mysql数据库用户的权限
2012/01/09 PHP
在Debian系统下配置LNMP的教程
2015/07/09 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
2015/07/29 PHP
十大使用PHP框架的理由
2015/09/26 PHP
php使用高斯算法实现图片的模糊处理功能示例
2016/11/11 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
2020/12/10 PHP
FireFox中textNode分片的问题
2007/04/10 Javascript
基于JQuery的一句代码实现表格的简单筛选
2010/07/26 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
2015/01/24 Javascript
AngularJS HTML DOM详解及示例代码
2016/08/17 Javascript
vue的props实现子组件随父组件一起变化
2016/10/27 Javascript
jQuery实现遍历复选框的方法示例
2017/03/06 Javascript
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
js计算两个日期间的天数月的实例代码
2018/09/20 Javascript
JavaScript对JSON数组简单排序操作示例
2019/01/31 Javascript
详解Js里的for…in和for…of的用法
2019/03/28 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
react实现同页面三级跳转路由布局
2019/09/26 Javascript
Python使用Redis实现作业调度系统(超简单)
2016/03/22 Python
django1.8使用表单上传文件的实现方法
2016/11/04 Python
一文总结学习Python的14张思维导图
2017/10/17 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
2018/02/05 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
浅谈Django中的QueryDict元素为数组的坑
2020/03/31 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
2020/12/07 Python
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
下列程序在32位linux或unix中的结果是什么
2015/01/26 面试题
专业实习自我鉴定
2013/10/29 职场文书
合伙经营协议书范本
2014/09/13 职场文书
教育合作协议范本
2014/10/17 职场文书
先进党支部事迹材料2016
2016/02/26 职场文书
MySQL批量更新不同表中的数据
2022/05/11 MySQL
nginx 配置指令之location使用详解
2022/05/25 Servers