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比较文件夹比另一同名文件夹多出的文件并复制出来的方法
Mar 05 Python
django文档学习之applications使用详解
Jan 29 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
Feb 03 Python
对Python 3.5拼接列表的新语法详解
Nov 08 Python
Django中reverse反转并且传递参数的方法
Aug 06 Python
Python中import导入不同目录的模块方法详解
Feb 18 Python
windows下的pycharm安装及其设置中文菜单
Apr 23 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
Jun 05 Python
Python调用shell cmd方法代码示例解析
Jun 18 Python
深入分析python 排序
Aug 24 Python
python实现canny边缘检测
Sep 14 Python
详解python3类型注释annotations实用案例
Jan 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
PHP学习之正则表达式
2011/04/17 PHP
PHP5各个版本的新功能和新特性总结
2014/03/16 PHP
PHP之预定义接口详解
2015/07/29 PHP
Yii2.0高级框架数据库增删改查的一些操作
2015/11/16 PHP
PHP简单实现DES加密解密的方法
2016/07/12 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
2016/10/10 PHP
Smarty3配置及入门语法
2017/02/22 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
Laravel登录失败次数限制的实现方法
2020/08/26 PHP
Javascript的IE和Firefox兼容性汇编(zz)
2007/02/02 Javascript
慎用 somefunction.prototype 分析
2009/06/02 Javascript
jQuery简单实现日历的方法
2015/05/04 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
vue实现打地鼠小游戏
2020/08/21 Javascript
vue组件讲解(is属性的用法)模板标签替换操作
2020/09/04 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
[01:15:16]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第一场 1月26日
2021/03/11 DOTA
python实现判断数组是否包含指定元素的方法
2015/07/15 Python
Python求算数平方根和约数的方法汇总
2016/03/09 Python
python运行时强制刷新缓冲区的方法
2019/01/14 Python
在Python IDLE 下调用anaconda中的库教程
2020/03/09 Python
基于Django集成CAS实现流程详解
2020/11/28 Python
Python实现微信表情包炸群功能
2021/01/28 Python
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
2016/06/28 HTML / CSS
LORAC官网:美国彩妆品牌
2019/08/27 全球购物
介绍一下EJB的体系结构
2012/08/01 面试题
Python的两道面试题
2013/06/29 面试题
高三英语教学反思
2014/01/13 职场文书
安踏广告词改编版
2014/03/21 职场文书
常务副总经理岗位职责
2014/04/12 职场文书
协议书范文
2015/01/27 职场文书
埃及王子观后感
2015/06/16 职场文书
2016春季运动会通讯稿
2015/07/18 职场文书
Spring Data JPA的Audit功能审计数据库的变更
2021/06/26 Java/Android