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进阶教程之模块(module)介绍
Aug 30 Python
在Python中使用dict和set方法的教程
Apr 27 Python
python语言使用技巧分享
May 31 Python
python制作企业邮箱的爆破脚本
Oct 05 Python
python简单线程和协程学习心得(分享)
Jun 14 Python
如何在python中使用selenium的示例
Dec 26 Python
pandas groupby 分组取每组的前几行记录方法
Apr 20 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
pandas 时间格式转换的实现
Jul 06 Python
解决python多行注释引发缩进错误的问题
Aug 23 Python
python matplotlib包图像配色方案分享
Mar 14 Python
python中怎么表示空值
Jun 19 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合并静态文件详解
2014/11/14 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
2016/01/07 PHP
PHP云打印类完整示例
2016/10/15 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
2017/05/20 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
2020/02/07 PHP
alixixi runcode.asp的代码不错的应用
2007/08/08 Javascript
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
jQuery插件实现多级联动菜单效果
2015/12/01 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
2016/04/19 Javascript
BootStrap智能表单实战系列(八)表单配置json详解
2016/06/13 Javascript
深入浅析search 搜索框的写法
2016/08/02 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
利用Node.js检测端口是否被占用的方法
2017/12/07 Javascript
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
详解element-ui中form验证杂记
2019/03/04 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
jQuery实现手风琴效果(蒙版)
2020/01/11 jQuery
flexible.js实现移动端rem适配方案
2020/04/07 Javascript
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
简单学习Python time模块
2016/04/29 Python
浅谈python中的getattr函数 hasattr函数
2016/06/14 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
python爬虫爬取淘宝商品信息(selenum+phontomjs)
2018/02/24 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
python解析json串与正则匹配对比方法
2018/12/20 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
教师评优的个人自我评价分享
2013/09/19 职场文书
汉语言文学毕业求职信
2014/07/17 职场文书
幼儿园保育员责任书
2014/07/22 职场文书
Golang全局变量加锁的问题解决
2021/05/08 Golang