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 相关文章推荐
微信 用脚本查看是否被微信好友删除
Oct 28 Python
python+requests+unittest API接口测试实例(详解)
Jun 10 Python
浅谈python numpy中nonzero()的用法
Apr 02 Python
pandas object格式转float64格式的方法
Apr 10 Python
django加载本地html的方法
May 27 Python
python字典值排序并取出前n个key值的方法
Oct 17 Python
Python编程图形库之Pillow使用方法讲解
Dec 28 Python
详解Python在使用JSON时需要注意的编码问题
Dec 06 Python
Python Sympy计算梯度、散度和旋度的实例
Dec 06 Python
使用python-opencv读取视频,计算视频总帧数及FPS的实现
Dec 10 Python
Python可变对象与不可变对象原理解析
Feb 25 Python
matplotlib之多边形选区(PolygonSelector)的使用
Feb 24 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 数组的创建、调用和更新实现代码
2009/03/09 PHP
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
2010/06/11 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
php使用str_replace替换多维数组的实现方法分析
2017/06/15 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
在网页中控制wmplayer播放器
2006/07/01 Javascript
Js+XML 操作
2006/09/20 Javascript
js几个不错的函数 $$()
2006/10/09 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
JavaScript Function函数类型介绍
2015/04/08 Javascript
javascript实现设置、获取和删除Cookie的方法
2015/06/01 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
vue mint-ui学习笔记之picker的使用
2017/10/11 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
jQuery实现简单弹幕效果
2019/11/28 jQuery
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
python抓取网页图片示例(python爬虫)
2014/04/27 Python
python中的sort方法使用详解
2014/07/25 Python
python win32 简单操作方法
2017/05/25 Python
Python数据集切分实例
2018/12/08 Python
Python.append()与Python.expand()用法详解
2019/12/18 Python
python3定位并识别图片验证码实现自动登录功能
2021/01/29 Python
HTML5 常用语法一览(列举不支持的属性)
2010/01/26 HTML / CSS
英国网上超市:Ocado
2020/03/05 全球购物
高中军训感言800字
2014/03/05 职场文书
爱情寄语大全
2014/04/09 职场文书
社区工作者演讲稿
2014/05/23 职场文书
优秀小学生事迹材料
2014/12/26 职场文书
党员个人承诺书
2015/04/27 职场文书
公司承诺书格式范文
2015/04/28 职场文书
停车场管理制度范本
2015/08/05 职场文书
MySQL常用慢查询分析工具详解
2022/08/14 MySQL