Django 中的f类

要对article阅读数进行增加,通常情况下我们会查找出对象,然后对对象的read字段进行进行操作,如下:在这里我们把article.read的值从数据库取出放到内存中,并用我们熟悉的python运算符操作,最后保存到数据库:

article = Article.objects.filter(id=1).first()
article.read +=1
article.save()

事实上,我们还可以这样做:

from django.db.models import FullArticleSerializer
article = Article.objects.filter(id=1).first()
article.read = F('read') +1
article.save()

从表面看 articel.read = f('read') +1 和正常的python 分配赋值给一个实例属性一样,事实上这是一个描述数据库操作的sql概念

当django 遇到F()实例,它覆盖标准的python运算符创建一个封装的sql表达式,在这个例子中, article.read就代表一个指示数据库对该字段进行增量的命令,无论article.read的值是或者曾是什么,python都不需要知道,而 完全交给数据库去处理。

 

F()配合update()可以应用于对象实例的querysets,它能减少get, save的使用。

article = Article.objects.filter(id=1).first()
article.update(read=F('read')+1)

我们可以使用update()方法批量地增加多个对象的字段值,这比先从数据库查询后,再循环一个个增加,并一个个保存要快很多

Article.objects.all().update(read=F('read')+1)

F()表达式的效率上的优点主要是:

    直接通过数据库操作而不是python

    减少数据库查询次数

上一篇:Django model on_delete参数

下一篇:Paramiko的简单使用