Django中F函数的使用示例代码详解


Posted in Python onJuly 06, 2020

F()函数

F()函数的导入

from django.db.models import F

为什么要使用F()函数?

一个 F()对象代表了一个model的字段值或注释列。使用它就可以直接参考model的field和执行数据库操作而不用再把它们(model field)查询出来放到python内存中。

开发个人博客时,统计每篇文章浏览量的逻辑通常是这样写的:

post = Post.objects.get(...)
post.views += 1
post.save()

上面的语句已经相当简短了,但实际上还有更好的办法,就是运用F函数:

from django.db.models import F

post = Post.objects.get(...)
post.views = F('views') + 1
post.save()

看起来似乎都差不多,但是用F函数有几个显著的好处:

  • 减少了操作次数post.view += 1是 Python 在内存中操作的,然后再从内存把数据更新到数据库;而F('views') + 1是直接操作的数据库,减少了一个操作层级。
  • 避免竞争。竞争是指多个 Python 线程同时对同一个数据进行更新,post.view += 1就有可能丢失其中的某些更新操作,而F('views') + 1由于是直接操作数据库,不会有丢失数据的问题。

注意,正因为F函数没有在内存中操作,因此更新完数据后需要重新刷新内存中的模型对象:

...
post.save()
# 重新取值
post = Post.objects.get(...)

或者这样:

...
post.save()
# 重新取值
post.refresh_from_db()

Done!

除此之外,F函数还支持跨字段的查找:

# models.py
class Age(models.Model):
  year = models.IntegerField(default=6)
  month = models.IntegerField(default=10)

# --------------

# 获取所有 year > month 的数据
res = Age.objects.filter(year__gt=F('month'))

F函数支持加,减,乘,除,取模和幂运算:

Age.objects.filter(year__gt=F('month') * 2)
Age.objects.filter(year__gt=F('month') + F('year'))

对于日期字段,也可以轻松处理:

>>> from datetime import timedelta
>>> Entry.objects.filter(date__gt=F('pub_date') + timedelta(days=3))

跨关系的查找也是可以的:

# models.py
class Person(...):
  name = ...

class People(...):
  name = ...

class Age(...):
  ...
  person = models.OneToOneField(Person, ...)
  people = models.OneToOneField(People, ...)

# --------------

# 获取所有 person.name == user.name 的数据
res = Age.objects.filter(person__name=F('people__name'))

F函数还有一些更高级的用法,如与聚合的配合,这里就不列举了,有兴趣的可以前往文档观摩。

到此这篇关于Django中F函数的使用的文章就介绍到这了,更多相关Django中F函数内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现的一个p2p文件传输实例
Jun 04 Python
Python模仿POST提交HTTP数据及使用Cookie值的方法
Nov 10 Python
python网络编程之数据传输UDP实例分析
May 20 Python
TensorFlow实现Softmax回归模型
Mar 09 Python
Python Xml文件添加字节属性的方法
Mar 31 Python
python退出命令是什么?详解python退出方法
Dec 10 Python
PyQt5 对图片进行缩放的实例
Jun 18 Python
python中struct模块之字节型数据的处理方法
Aug 27 Python
Python 日志logging模块用法简单示例
Oct 18 Python
Python Scrapy多页数据爬取实现过程解析
Jun 12 Python
Python如何输出警告信息
Jul 30 Python
彻底弄懂Python中的回调函数(callback)
Jun 25 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
Jul 06 #Python
Django-imagekit的使用详解
Jul 06 #Python
大数据分析用java还是Python
Jul 06 #Python
python文件操作seek()偏移量,读取指正到指定位置操作
Jul 05 #Python
python 读txt文件,按‘,’分割每行数据操作
Jul 05 #Python
python如何调用java类
Jul 05 #Python
使用Python文件读写,自定义分隔符(custom delimiter)
Jul 05 #Python
You might like
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
javascript 获取元素位置的快速方法 getBoundingClientRect()
2009/11/26 Javascript
JavaScript 数组详解
2013/10/10 Javascript
利用JavaScript实现新闻滚动效果(实例代码)
2013/11/27 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
javascript的tab切换原理与效果实现方法
2015/01/10 Javascript
JavaScript获取一个范围内日期的方法
2015/04/24 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
Javascript中作用域的详细介绍
2016/10/06 Javascript
详解在网页上通过JS实现文本的语音朗读
2019/03/28 Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
2019/07/24 Javascript
基于vue、react实现倒计时效果
2019/08/26 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
vue data引入本地图片的两种方式小结
2019/11/13 Javascript
JQuery表单元素取值赋值方法总结
2020/05/12 jQuery
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
python实现简单爬虫功能的示例
2016/10/24 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
2017/01/20 Python
python读取二进制mnist实例详解
2017/05/31 Python
python实现图片压缩代码实例
2019/08/12 Python
Python和Bash结合在一起的方法
2020/11/13 Python
巧用CSS3 border实现图片遮罩效果代码
2012/04/09 HTML / CSS
味多美官网:蛋糕订购,100%使用天然奶油
2017/11/10 全球购物
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
英国豪华家具和家居用品购物网站:Teddy Beau
2020/10/12 全球购物
淘宝中秋节活动方案
2014/01/31 职场文书
公司联欢晚会主持词
2014/03/22 职场文书
一年级小学生评语
2014/04/22 职场文书
2014年师德承诺书
2014/05/23 职场文书
村干部群众路线整改措施思想汇报
2014/10/12 职场文书
六查六看个人剖析材料
2014/10/14 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
个人年度总结报告
2015/03/09 职场文书
党风廉政承诺书2016
2016/03/25 职场文书
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python