博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在Django中使用F()函数
阅读量:5856 次
发布时间:2019-06-19

本文共 1818 字,大约阅读时间需要 6 分钟。

F()允许Django在未实际链接数据的情况下具有对数据库字段的值的引用。通常情况下我们在更新数据时需要先从数据库里将原数据取出后方在内存里,然后编辑某些属性,最后提交。例如这样

# Tintin filed a news story!reporter = Reporters.objects.get(name='Tintin')reporter.stories_filed += 1reporter.save() 

上述代码中我们先将reporter.stories_filed的值从数据库中取出放到内存中然后利用python的语法操作计算出新的值之后调用save()方法保存回数据库最终生成是SQL语句有可能是类似

updatereporterset stores_filed = 20 wherename = 'smp'; --20可能是经过计算之后得到的值。 

而我们知道其实我们的需求其实可以理解成SQL:

updatereporterset stores_filed = stores_filed+1 wherename = 'smp' 

解决

而F()函数的左右就是直接生成SQL语句来描述类似的需求,看下面代码:

fromdjango.db.modelsimport F reporter = Reporters.objects.get(name='Tintin')reporter.stories_filed = F('stories_filed') + 1reporter.save() 

虽然代码 reporter.stories_filed = F('stories_filed') + 1 有点类似python风格的代码,但实际上却能生成SQL语句直接描述对数据库的操作。

当Django程序中出现F()时,Django会使用SQL语句的方式取代标准的Python操作。

上述代码中不管 reporter.stories_filed 的值是什么,Python都不曾获取过其值,python做的唯一的事情就是通过Django的F()函数创建了一条SQL语句然后执行而已。

需要注意的是在使用上述方法更新过数据之后需要重新加载数据来使数据库中的值与程序中的值对应:

reporter = Reporters.objects.get(pk=reporter.pk)

或者使用更加简单的方法:

reporter.refresh_from_db()

更新多条数据

与上面的在一个对象中操作的例子相似,F()函数同样可以使用在查询集中,配合update()方法。这样我们同样可以将更新的两步合并成一步:

reporter = Reporters.objects.filter(name='Tintin')reporter.update(stories_filed=F('stories_filed') + 1) 

我们同样可以使用 update() 方法增加或者更改字段的值,这样做的效率比将其取到内存中后再一个个计算值再更新数据库的效率会提高非常多。

Reporter.objects.all().update(stories_filed=F('stories_filed') + 1)

组合使用

F()函数可以在创建模型时根据已知的N个字段组合出另外的字段数据,看下面的例子:

company = Company.objects.annotate(    chairs_needed=F('num_employees') - F('num_chairs')) 

但是如果组合的两个字段拥有不同的数据类型,那么咱们需要手动告诉Django新生成的数据类似是什么,看下面的列子:

fromdjango.db.modelsimportDateTimeField, ExpressionWrapper, F Ticket.objects.annotate(    expires=ExpressionWrapper(        F('active_at') + F('duration'), output_field=DateTimeField())) 

上述代码描述了个过期时间的概念,数据库中保存的是激活时间和持续时间,并且通过参数 output_field 告诉 expires 的类型为 DateTimeField

转载地址:http://rwljx.baihongyu.com/

你可能感兴趣的文章
算法之【牛顿迭代法】
查看>>
社会地位即服务, Status as a Service (二): 社交网络的投资回报率 (ROI)
查看>>
精通CSS滤镜(filter)(实例解析)
查看>>
Kafka 1.0.0安装和配置--Linux篇
查看>>
小熊猫学木匠,无序到有序的代价!
查看>>
关于Keytool创建服务器自签名证书
查看>>
如何详细设置SUN/IBM JVM的GC日志输出(转)
查看>>
python3.x异常处理(X)-------------官方文档的异常类型
查看>>
springboot git maven jenkins 实现自动化部署
查看>>
VIM使用系列:使用VIM进行项目开发的准备工作
查看>>
踢开绊脚石:微服务难点之服务调用的解决方案
查看>>
JS前台数据校验(常用)留底备份
查看>>
android国际化
查看>>
gulp中如何保证任务执行顺序。
查看>>
PHP PDO prepare()、execute()和bindParam()方法详解
查看>>
Linux学习笔记:MYSQL 5.5安装与多实例运行
查看>>
CentOS安装DNS Server(bind)
查看>>
web service axis2常见异常原因
查看>>
nagios 监控 cisco 交换机
查看>>
GRUB Legacy
查看>>