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实现CET查分的方法
Mar 10 Python
python的random模块及加权随机算法的python实现方法
Jan 04 Python
Python实现破解12306图片验证码的方法分析
Dec 29 Python
运行django项目指定IP和端口的方法
May 14 Python
pandas 将list切分后存入DataFrame中的实例
Jul 03 Python
Flask框架Flask-Principal基本用法实例分析
Jul 23 Python
python实现归并排序算法
Nov 22 Python
浅析Python 读取图像文件的性能对比
Mar 07 Python
Python中字符串List按照长度排序
Jul 01 Python
基于Python中isfile函数和isdir函数使用详解
Nov 29 Python
Django返回HTML文件的实现方法
Sep 17 Python
Python pyecharts绘制条形图详解
Apr 02 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
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
2015/10/26 PHP
thinkPHP微信分享接口JSSDK用法实例
2017/07/07 PHP
非常好的js代码
2006/06/27 Javascript
用脚本调用样式的几种方法
2006/12/09 Javascript
jQuery中filter()和find()的区别深入了解
2013/09/25 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
angularJS结合canvas画图例子
2015/02/09 Javascript
JavaScript中的Repaint和Reflow用法详解
2015/07/27 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
jQuery is not defined 错误原因与解决方法小结
2017/03/19 Javascript
layui添加动态菜单与选项卡
2019/07/26 Javascript
vue+elementUI组件table实现前端分页功能
2020/11/15 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
[02:35]DOTA2英雄基础教程 末日使者
2013/12/04 DOTA
pycharm 使用心得(二)设置字体大小
2014/06/05 Python
Python实现单词拼写检查
2015/04/25 Python
详解python上传文件和字符到PHP服务器
2017/11/24 Python
python3使用smtplib实现发送邮件功能
2018/05/22 Python
Python基于百度云文字识别API
2018/12/13 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
2020/02/17 Python
使用Tkinter制作信息提示框
2020/02/18 Python
Django 删除upload_to文件的步骤
2020/03/30 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
2020/09/01 Python
matplotlib之多边形选区(PolygonSelector)的使用
2021/02/24 Python
css3使用animation属性实现炫酷效果(推荐)
2020/02/04 HTML / CSS
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
TripAdvisor日本:全球领先的旅游网站
2019/02/14 全球购物
销售代表求职自荐信
2013/10/01 职场文书
获奖的大学生创业计划书
2014/01/05 职场文书
《明天,我们毕业》教学反思
2014/04/24 职场文书
女方家长婚礼致辞
2015/07/27 职场文书
python双向链表实例详解
2022/05/25 Python
Ubuntu18.04下QT开发Android无法连接设备问题解决实现
2022/06/01 Java/Android