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使用回溯法子集树模板解决迷宫问题示例
Sep 01 Python
Python实现矩阵转置的方法分析
Nov 24 Python
Python字典数据对象拆分的简单实现方法
Dec 05 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
Apr 10 Python
windows下安装Python虚拟环境virtualenvwrapper-win
Jun 14 Python
django2笔记之路由path语法的实现
Jul 17 Python
Python3 main函数使用sys.argv传入多个参数的实现
Dec 25 Python
python 中的paramiko模块简介及安装过程
Feb 29 Python
Django 404、500页面全局配置知识点详解
Mar 10 Python
python nohup 实现远程运行不宕机操作
Apr 16 Python
基于Tensorflow一维卷积用法详解
May 22 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
Jun 03 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
制作美丽的拉花
2021/03/03 冲泡冲煮
有关 PHP 和 MySQL 时区的一点总结
2008/03/26 PHP
谈谈关于php的优点与缺点
2013/04/11 PHP
基于PHP文件操作的详解
2013/06/05 PHP
yii框架通过控制台命令创建定时任务示例
2014/04/30 PHP
php创建session的方法实例详解
2015/01/27 PHP
php计算给定时间之前的函数用法实例
2015/04/03 PHP
PHP编写daemon process详解及实例代码
2016/09/30 PHP
Mac下php 5升级到php 7的步骤详解
2017/04/26 PHP
PHP运用foreach神奇的转换数组(实例讲解)
2018/02/01 PHP
PHP实现类似题库抽题效果
2018/08/16 PHP
php适配器模式简单应用示例
2019/10/23 PHP
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
2011/05/24 Javascript
Firefox中beforeunload事件的实现缺陷浅析
2012/05/03 Javascript
nodejs实现遍历文件夹并统计文件大小
2015/05/28 NodeJs
浅谈JavaScript的自动垃圾收集机制
2016/12/15 Javascript
深入浅析angular和vue还有jquery的区别
2018/08/13 jQuery
vue强制刷新组件的方法示例
2019/02/28 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
2020/03/03 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
解决vuecli3中img src 的引入问题
2020/08/04 Javascript
解决vue scoped scss 无效的问题
2020/09/04 Javascript
python timestamp和datetime之间转换详解
2017/12/11 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
selenium+python自动化测试之多窗口切换
2019/01/23 Python
python Django里CSRF 对应策略详解
2019/08/05 Python
python字符串替换re.sub()实例解析
2020/02/09 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
工程安全员岗位职责
2014/03/09 职场文书
信用社竞聘演讲稿
2014/05/16 职场文书
教师批评与自我批评心得体会
2014/10/16 职场文书
2014年基层党支部工作总结
2014/12/04 职场文书
功夫熊猫观后感
2015/06/10 职场文书
换届选举主持词
2015/07/03 职场文书
初中数学教学反思范文
2016/02/17 职场文书
从结婚开始的恋爱故事。小说《我的美好婚事》TV动画化决定
2022/04/07 日漫