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使用post提交数据到远程url的方法
Apr 29 Python
Django框架中的对象列表视图使用示例
Jul 21 Python
Python实现将xml导入至excel
Nov 20 Python
Python之py2exe打包工具详解
Jun 14 Python
Python实现PS滤镜特效之扇形变换效果示例
Jan 26 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
Apr 11 Python
使用Python进行QQ批量登录的实例代码
Jun 11 Python
利用Python+阿里云实现DDNS动态域名解析的方法
Apr 01 Python
Python变量访问权限控制详解
Jun 29 Python
利用python实现PSO算法优化二元函数
Nov 13 Python
Python同时迭代多个序列的方法
Jul 28 Python
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
May 14 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中实现图片的锐化
2006/10/09 PHP
浅谈php中mysql与mysqli的区别分析
2013/06/10 PHP
php实现信用卡校验位算法THE LUHN MOD-10示例
2014/05/07 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(二)
2014/06/23 PHP
Yii遍历行下每列数据的方法
2016/10/17 PHP
php读取本地json文件的实例
2018/03/07 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
XP折叠菜单&仿QQ2006菜单
2006/12/16 Javascript
JQuery动态给table添加、删除行 改进版
2011/01/19 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
原生JS实现响应式瀑布流布局
2015/04/02 Javascript
javascript字符串与数组转换汇总
2015/05/26 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
vue.js移动端app实战1:初始配置详解
2017/07/24 Javascript
three.js 入门案例详解
2018/01/23 Javascript
Vue使用mixins实现压缩图片代码
2018/03/14 Javascript
jQuery pagination分页示例详解
2018/10/23 jQuery
JS+Canvas实现五子棋游戏
2020/08/26 Javascript
python多进程读图提取特征存npy
2019/05/21 Python
Django REST framework 分页的实现代码
2019/06/19 Python
python Pandas库基础分析之时间序列的处理详解
2019/07/13 Python
python sqlite的Row对象操作示例
2019/09/11 Python
python爬虫中多线程的使用详解
2019/09/23 Python
使用python快速在局域网内搭建http传输文件服务的方法
2019/11/14 Python
python 操作mysql数据中fetchone()和fetchall()方式
2020/05/15 Python
Numpy实现卷积神经网络(CNN)的示例
2020/10/09 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
2020/12/07 Python
英国外籍人士的在线超市:British Corner Shop
2019/06/03 全球购物
你懂得怎么写自荐信吗?
2013/12/27 职场文书
行政主管职责范本
2014/03/07 职场文书
感恩的演讲稿
2014/05/06 职场文书
2014年国庆节广播稿
2014/09/19 职场文书
出差报告范文
2014/11/06 职场文书
幼儿园小班教学反思
2016/03/03 职场文书
大学生创业,为什么都会选择快餐饮?
2019/08/08 职场文书