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中统计函数运行耗时的方法
May 05 Python
django通过ajax发起请求返回JSON格式数据的方法
Jun 04 Python
Python实现读取及写入csv文件的方法示例
Jan 12 Python
python如何拆分含有多种分隔符的字符串
Mar 20 Python
使用Python进行QQ批量登录的实例代码
Jun 11 Python
python基于http下载视频或音频
Jun 20 Python
python实现爬取图书封面
Jul 05 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
Aug 24 Python
python DataFrame转dict字典过程详解
Dec 26 Python
浅谈pytorch池化maxpool2D注意事项
Feb 18 Python
了解一下python内建模块collections
Sep 07 Python
Python创建文件夹与文件的快捷方法
Dec 08 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防注
2007/01/15 PHP
php2html php生成静态页函数
2008/12/08 PHP
PHP为表单获取的URL 地址预设 http 字符串函数代码
2010/05/26 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
2014/06/30 PHP
Linux下安装PHP MSSQL扩展教程
2014/10/24 PHP
thinkPHP中钩子的两种配置调用方法详解
2016/11/11 PHP
Yii框架日志操作图文与实例详解
2019/09/09 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
js或css实现滚动广告的几种方案
2010/01/28 Javascript
Prototype的Class.create函数解析
2011/09/22 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
jQuery实现首页顶部可伸缩广告特效代码
2015/04/15 Javascript
js实现点击图片自动提交action的简单方法
2016/10/16 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
JavaScript创建对象的七种方式(推荐)
2017/06/26 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
Express使用html模板的详细代码
2017/09/18 Javascript
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
详解react阻止无效重渲染的多种方式
2018/12/11 Javascript
JavaScript学习笔记之DOM操作实例分析
2019/01/08 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
koa-passport实现本地验证的方法示例
2020/02/20 Javascript
微信小程序实现购物车小功能
2020/12/30 Javascript
python实现的简单文本类游戏实例
2015/04/28 Python
Python有序查找算法之二分法实例分析
2017/12/11 Python
python二进制文件的转译详解
2019/07/03 Python
Python 获取项目根路径的代码
2019/09/27 Python
一文详述 Python 中的 property 语法
2020/09/01 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
英国领先的在线高尔夫商店:Scottsdale Golf
2019/08/26 全球购物
生日主持词
2014/03/20 职场文书
七一建党日演讲稿
2014/09/05 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
2014年小学安全工作总结
2014/12/04 职场文书
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python
VUE递归树形实现多级列表
2022/07/15 Vue.js