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使用正则匹配实现抓图代码分享
Apr 02 Python
python操作mongodb根据_id查询数据的实现方法
May 20 Python
基于Python 的进程管理工具supervisor使用指南
Sep 18 Python
详解Python中的静态方法与类成员方法
Feb 28 Python
Python 中 list 的各项操作技巧
Apr 13 Python
python类的方法属性与方法属性的动态绑定代码详解
Dec 27 Python
python将字符串以utf-8格式保存在txt文件中的方法
Oct 30 Python
python实现socket+threading处理多连接的方法
Jul 23 Python
解决python中导入win32com.client出错的问题
Jul 26 Python
修改Pandas的行或列的名字(重命名)
Dec 18 Python
Python爬虫进阶之爬取某视频并下载的实现
Dec 08 Python
python 利用 PIL 将数组值转成图片的实现
Apr 12 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
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
2017/04/19 PHP
PHP attributes()函数讲解
2019/02/03 PHP
php的优点总结 php有哪些优点
2019/07/19 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
document 和 document.all 分别什么时候用
2006/06/22 Javascript
创建一个复制UBB软件信息的链接或按钮的js代码
2008/01/06 Javascript
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
2012/12/27 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
node.js超时timeout详解
2014/11/26 Javascript
js实现大转盘抽奖游戏实例
2015/06/24 Javascript
jQuery日程管理控件glDatePicker用法详解
2017/03/29 jQuery
值得分享和收藏的xmlplus组件学习教程
2017/05/05 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
node.js遍历目录的方法示例
2018/08/01 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
JavaScript常见继承模式实例小结
2019/01/11 Javascript
vue2.x 对象劫持的原理实现
2020/04/19 Javascript
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
Python字符串的修改方法实例
2019/12/19 Python
python爬虫利用代理池更换IP的方法步骤
2021/02/21 Python
澳洲女装时尚在线:Blue Bungalow
2018/05/05 全球购物
Street One瑞士:德国现代时装公司
2019/10/09 全球购物
什么是数组名
2012/05/10 面试题
shell程序如何生命变量?shell变量是弱变量吗?
2014/11/10 面试题
英语系本科生个人求职信
2013/09/21 职场文书
公司企业表扬信
2014/01/11 职场文书
道路建设实施方案
2014/03/18 职场文书
信访工作经验交流材料
2014/05/23 职场文书
违章停车检讨书
2014/10/21 职场文书
学术会议领导致辞
2015/07/29 职场文书