要对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
减少数据库查询次数