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发送各种形式的邮件的方法汇总
Nov 09 Python
Python正则表达式使用经典实例
Jun 21 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
Jan 08 Python
Python实现的购物车功能示例
Feb 11 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
Jun 07 Python
解决python3运行selenium下HTMLTestRunner报错的问题
Dec 27 Python
Python3.5基础之NumPy模块的使用图文与实例详解
Apr 24 Python
django框架实现一次性上传多个文件功能示例【批量上传】
Jun 19 Python
python pandas生成时间列表
Jun 29 Python
python的re模块使用方法详解
Jul 26 Python
Python使用openpyxl批量处理数据
Jun 23 Python
Appium中scroll和drag_and_drop根据元素位置滑动
Feb 15 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 冲泡冲煮
Windows下部署Apache+PHP+MySQL运行环境实战
2012/08/31 PHP
php递归函数中使用return的注意事项
2014/01/17 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
[IE&FireFox兼容]JS对select操作
2007/01/07 Javascript
优化javascript的执行效率一些方法总结
2013/12/25 Javascript
JavaScript事件详细讲解
2016/06/27 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
JS实现图片局部放大或缩小的方法
2016/08/20 Javascript
javascript简单进制转换实现方法
2016/11/24 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
2017/04/07 Javascript
Jquery获取radio选中的值
2017/05/05 jQuery
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
webpack external模块的具体使用
2018/03/10 Javascript
Vue.js组件使用props传递数据的方法
2019/10/19 Javascript
基于js实现判断浏览器类型代码实例
2020/07/17 Javascript
VUE实时监听元素距离顶部高度的操作
2020/07/29 Javascript
vue中可编辑树状表格的实现代码
2020/10/31 Javascript
python33 urllib2使用方法细节讲解
2013/12/03 Python
Python编程中装饰器的使用示例解析
2016/06/20 Python
python 打印出所有的对象/模块的属性(实例代码)
2016/09/11 Python
Python面向对象之类的定义与继承用法示例
2019/01/14 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
python 用所有标点符号分隔句子的示例
2019/07/15 Python
基于Python实现签到脚本过程解析
2019/10/25 Python
Python批量将图片灰度化的实现代码
2020/04/11 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
设计师珠宝:Ylang 23
2018/05/11 全球购物
美国亚洲时尚和美容产品的一站式网上商店:Stylevana
2019/09/05 全球购物
专业求职信撰写要诀
2014/02/18 职场文书
买房委托公证书
2014/04/08 职场文书
三八妇女节趣味活动方案
2014/08/23 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
教师岗位职责范本
2015/04/02 职场文书
大学班干部竞选稿
2015/11/20 职场文书