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 相关文章推荐
pycharm 使用心得(九)解决No Python interpreter selected的问题
Jun 06 Python
Python中使用摄像头实现简单的延时摄影技术
Mar 27 Python
简单介绍Python中的len()函数的使用
Apr 07 Python
Windows下Python2与Python3两个版本共存的方法详解
Feb 12 Python
python中的闭包函数
Feb 09 Python
tensorflow pb to tflite 精度下降详解
May 25 Python
python实现取余操作的简单实例
Aug 16 Python
如何使用python写截屏小工具
Sep 29 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
Nov 12 Python
Python中glob库实现文件名的匹配
Jun 18 Python
python树莓派通过队列实现进程交互的程序分析
Jul 04 Python
关于python pygame游戏进行声音添加的技巧
Oct 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
重置版战役片段
2020/04/09 魔兽争霸
PHP脚本的10个技巧(5)
2006/10/09 PHP
php一维二维数组键排序方法实例总结
2014/11/13 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
jquery uaMatch源代码
2011/02/14 Javascript
jquery maxlength使用说明
2011/09/09 Javascript
从零学jquery之如何使用回调函数
2014/05/16 Javascript
javascript基本包装类型介绍
2015/04/10 Javascript
浅谈Javascript数组索引
2015/07/29 Javascript
javascript中this指向详解
2016/04/23 Javascript
微信小程序中的swiper组件详解
2017/04/14 Javascript
详解jQuery中的isPlainObject()使用方法
2018/02/27 jQuery
使用webpack搭建vue项目实现脚手架功能
2019/03/15 Javascript
vue中监听返回键问题
2019/08/28 Javascript
JS多个异步请求 按顺序执行next实现解析
2019/09/16 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
基于node+websocket+html实现腾讯课堂聊天室聊天功能
2020/03/04 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
2020/04/11 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
vue全局使用axios的操作
2020/09/08 Javascript
基于Python log 的正确打开方式
2018/04/28 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
tensorflow之并行读入数据详解
2020/02/05 Python
对python中各个response的使用说明
2020/03/28 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
Python基于QQ邮箱实现SSL发送
2020/04/26 Python
Html5移动端获奖无缝滚动动画实现示例
2018/06/25 HTML / CSS
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
阿巴庭院:Abba Patio
2019/06/18 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
史上最全面的Java面试题汇总!
2015/02/03 面试题
师德建设实施方案
2014/03/21 职场文书
幼儿园小班评语大全
2014/04/17 职场文书
公司党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
大学新生入学感想
2015/08/07 职场文书
幼儿园教师教育随笔
2015/08/14 职场文书