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嵌套函数使用外部函数变量的方法(Python2和Python3)
Jan 31 Python
Windows下python3.6.4安装教程
Jul 31 Python
python实现将多个文件分配到多个文件夹的方法
Jan 07 Python
华为校园招聘上机笔试题 扑克牌大小(python)
Apr 22 Python
python中的global关键字的使用方法
Aug 20 Python
Python属性和内建属性实例解析
Jan 14 Python
Python 动态变量名定义与调用方法
Feb 09 Python
如何在Python 游戏中模拟引力
Mar 27 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
Jun 01 Python
opencv 阈值分割的具体使用
Jul 08 Python
Python如何在bool函数中取值
Sep 21 Python
python中str内置函数用法总结
Dec 27 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
DC《小丑》11项提名领跑奥斯卡 Netflix成第92届奥斯卡提名最大赢家
2020/04/09 欧美动漫
加强版phplib的DB类
2008/03/31 PHP
基于Windows下Apache PHP5.3.1安装教程
2010/01/08 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
jQuery表格列宽可拖拽改变且兼容firfox
2014/09/03 Javascript
javascript实现切换td中的值
2014/12/05 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
Node.js文件操作方法汇总
2016/03/22 Javascript
初探nodeJS
2017/01/24 NodeJs
JS动态生成年份和月份实例代码
2017/02/04 Javascript
JavaScript闭包的简单应用
2017/09/01 Javascript
Three.js利用性能插件stats实现性能监听的方法
2017/09/25 Javascript
微信小程序wx.previewImage预览图片实例详解
2017/12/07 Javascript
vue-cli开发时,关于ajax跨域的解决方法(推荐)
2018/02/03 Javascript
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
MAC中PyCharm设置python3解释器
2017/12/15 Python
Python实现文件信息进行合并实例代码
2018/01/17 Python
Django中使用Celery的教程详解
2018/08/24 Python
Python 中Django安装和使用教程详解
2019/07/03 Python
python列表推导和生成器表达式知识点总结
2020/01/10 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
用python 绘制茎叶图和复合饼图
2021/02/26 Python
CSS3 :default伪类选择器使用简介
2018/03/15 HTML / CSS
Auguste The Label官网:澳大利亚一家精品女装时尚品牌
2020/06/14 全球购物
倡议书格式范文
2014/04/14 职场文书
借款协议书范本
2014/04/22 职场文书
部门活动策划方案
2014/08/16 职场文书
防灾减灾活动总结
2014/08/30 职场文书
2014大学生党员评议个人总结
2014/09/22 职场文书
二年级语文下册复习计划
2015/01/19 职场文书
医德医风自我评价2015
2015/03/03 职场文书
2016新年晚会开场白
2015/12/03 职场文书
市场营销计划书
2019/04/24 职场文书
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
2022/08/05 Servers