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 Sql数据库增删改查操作简单封装
Apr 18 Python
Python 3.7新功能之dataclass装饰器详解
Apr 21 Python
Python中property函数用法实例分析
Jun 04 Python
python将pandas datarame保存为txt文件的实例
Feb 12 Python
对python_discover方法遍历所有执行的用例详解
Feb 13 Python
python防止随意修改类属性的实现方法
Aug 21 Python
Linux下通过python获取本机ip方法示例
Sep 06 Python
pytorch实现线性拟合方式
Jan 15 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
Mar 23 Python
在python中修改.properties文件的操作
Apr 08 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
Jul 01 Python
Python利用pip安装tar.gz格式的离线资源包
Sep 14 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
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
?繁体转换的class
2006/10/09 PHP
php self,$this,const,static,->的使用
2009/10/22 PHP
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
2018/05/12 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
JavaScript设计模式之原型模式(Object.create与prototype)介绍
2014/12/28 Javascript
javascript单页面手势滑屏切换原理详解
2016/03/21 Javascript
Javascript实现汉字和拼音互转的终极方案
2016/10/19 Javascript
使用JS正则表达式 替换括号,尖括号等
2016/11/29 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
2016/12/23 Javascript
axios向后台传递数组作为参数的方法
2018/08/11 Javascript
详解如何在vue项目中使用lodop打印插件
2018/09/27 Javascript
简单通过settimeout看javascript的运行机制
2019/05/10 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
2020/06/05 Javascript
[01:33]PWL开团时刻DAY2-开雾与反开雾
2020/10/31 DOTA
Python中的深拷贝和浅拷贝详解
2015/06/03 Python
Python实现列表删除重复元素的三种常用方法分析
2017/11/24 Python
Python语言描述最大连续子序列和
2017/12/05 Python
TensorFlow实现随机训练和批量训练的方法
2018/04/28 Python
详解python中的time和datetime的常用方法
2019/07/08 Python
python 实现多线程下载视频的代码
2019/11/15 Python
CSS3实现闪烁动画效果的方法
2015/02/09 HTML / CSS
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
英国袜子店:Sock Shop
2017/01/11 全球购物
迪拜航空官方网站:flydubai
2017/04/20 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
大学生毕业求职找工作的自我评价
2013/09/29 职场文书
电大毕业生自我鉴定
2013/11/10 职场文书
机械设计及其自动化求职推荐信
2014/02/17 职场文书
物业品质提升方案
2014/06/08 职场文书
镇党委书记群众路线整改措施思想汇报
2014/10/13 职场文书
法学专业求职信范文
2015/03/19 职场文书
2015年幼儿园教育教学工作总结
2015/05/25 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书