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的Django框架中显示对象子集的方法
Jul 21 Python
详解Python Socket网络编程
Jan 05 Python
Python的collections模块中namedtuple结构使用示例
Jul 07 Python
如何高效使用Python字典的方法详解
Aug 31 Python
解决Pycharm中import时无法识别自己写的程序方法
May 18 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
python登录WeChat 实现自动回复实例详解
May 28 Python
让Python脚本暂停执行的几种方法(小结)
Jul 11 Python
linux环境下Django的安装配置详解
Jul 22 Python
python写入数据到csv或xlsx文件的3种方法
Aug 23 Python
python接口自动化如何封装获取常量的类
Dec 24 Python
python 多线程爬取壁纸网站的示例
Feb 20 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
新闻分类录入、显示系统
2006/10/09 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
[原创]CI(CodeIgniter)简单统计访问人数实现方法
2016/01/19 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
2016/05/18 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
2019/09/27 PHP
使两个iframe的高度与内容自适应,且相等
2006/11/20 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
利用js动态添加删除table行的示例代码
2013/12/16 Javascript
javascript中不等于的代码是什么怎么写
2013/12/29 Javascript
基于JavaScript实现移动端点击图片查看大图点击大图隐藏
2015/11/04 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
AngularJS入门教程之ng-class 指令用法
2016/08/01 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
2016/09/19 Javascript
js中的面向对象入门
2017/03/06 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
微信小程序开发实现消息推送
2020/11/18 Javascript
Vue.js实现备忘录功能
2019/06/26 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
2019/08/16 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
小程序实现简单语音聊天的示例代码
2020/07/24 Javascript
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
Python版微信红包分配算法
2015/05/04 Python
Python中几个比较常见的名词解释
2015/07/04 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
解决Django加载静态资源失败的问题
2019/07/28 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
一道Delphi面试题
2016/10/28 面试题
工作人员思想汇报
2014/01/09 职场文书
材料专业毕业生求职信
2014/02/26 职场文书
说明书格式及范文
2014/05/07 职场文书
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
商业计划书范文
2019/04/24 职场文书
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android