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 相关文章推荐
在django中使用自定义标签实现分页功能
Jul 04 Python
Python实现简单文本字符串处理的方法
Jan 22 Python
Python Learning 列表的更多操作及示例代码
Aug 22 Python
详解基于python的多张不同宽高图片拼接成大图
Sep 26 Python
Python运行DLL文件的方法
Jan 17 Python
Python callable内置函数原理解析
Mar 05 Python
Python实现转换图片背景颜色代码
Apr 30 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
May 26 Python
PyInstaller运行原理及常用操作详解
Jun 13 Python
python中用ctypes模拟点击的实例讲解
Nov 26 Python
Python基础详解之描述符
Apr 28 Python
Python趣味挑战之教你用pygame画进度条
May 31 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
PHILIPS D1835/D1875的电路分析与打理
2021/03/02 无线电
php获取四位字母和数字的随机数的实现方法
2015/01/09 PHP
使用PHP进行微信公众平台开发的示例
2015/08/21 PHP
php显示页码分页类的封装
2017/06/08 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
你可能不再需要JQUERY
2021/03/09 Javascript
利用js获取服务器时间的两个简单方法
2010/01/08 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
js 性能优化之快速响应的用户界面
2017/02/15 Javascript
JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码
2017/09/23 jQuery
ajax请求data遇到的问题分析
2018/01/18 Javascript
JS实现百度搜索接口及链接功能实例代码
2018/02/02 Javascript
vue 路由页面之间实现用手指进行滑动的方法
2018/02/23 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
vue实现的封装全局filter并统一管理操作示例
2020/02/02 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
python 平衡二叉树实现代码示例
2018/07/07 Python
Python爬虫小技巧之伪造随机的User-Agent
2018/09/13 Python
对python的unittest架构公共参数token提取方法详解
2018/12/17 Python
Java文件与类动手动脑实例详解
2019/11/10 Python
python自动化实现登录获取图片验证码功能
2019/11/20 Python
运行python提示no module named sklearn的解决方法
2020/11/29 Python
PyTorch中clone()、detach()及相关扩展详解
2020/12/09 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
人事科岗位职责范本
2014/03/02 职场文书
2014年宣传部工作总结
2014/11/12 职场文书
工作态度不好检讨书
2015/05/06 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
单位收入证明范本
2015/06/18 职场文书
公司酒会主持词
2015/07/02 职场文书
Python绘制分类图的方法
2021/04/20 Python
发工资啦!教你用Python实现邮箱自动群发工资条
2021/05/10 Python
web前端之css水平居中代码解析
2021/05/20 HTML / CSS
html+css实现赛博朋克风格按钮
2021/05/26 HTML / CSS