F()函数
F()函数的导入
from django.db.models import F
为什么要使用F()函数?
一个 F()对象代表了一个model的字段值或注释列。使用它就可以直接参考model的field和执行数据库操作而不用再把它们(model field)查询出来放到python内存中。
作为代替,Django使用 F()对象生成一个SQL表达式,来描述数据库层级所需要的操作
这些通过一个例子可以很容易的理解。往常,我们会这样做:
普通方式
reporter = Reporters.objects.get(name='Tintin')
reporter.stories_filed += 1 # 放到内存中,使用python计算,然后通过save方法保存
reporter.save()
使用F表达式 (简单使用)
rom django.db.models import F
reporter = Reporters.objects.get(name='Tintin')
reporter.stories_filed = F('stories_filed') + 1
reporter.save()
虽然看上去和上面的内存Python操作相似,但事实上这是一个描述数据库操作的sql概念
当django遇到F()实例,它覆盖了标准的Python运算符创建一个封装的SQL表达式。在这个例子中,reporter.stories_filed就代表了一个指示数据库对该字段进行增量的命令。
无论reporter.stories_filed的值是或曾是什么,Python一无所知–这完全是由数据库去处理的。所有的Python,通过Django的F() 类,只是去创建SQL语法参考字段和描述操作
注意:
使用F()函数保存值后,再次使用实例调用并不能拿到新的值.这是因为F()函数是数据库操作,并不是在内存中python进行的,所以之前拿到的实例存储的还是之前的值.所以需要重新载入实例(即重新获取实例)
普通方式
>>reporter = Reporters.objects.get(name='Tintin')
>>reporter.stories_filed
10
>>reporter.stories_filed += 1
>>reporter.stories_filed # 普通方式是在内存中执行的,所以就算不保存也能拿到值,值是存储在内存中的
11 # 这个时候数据库中的值还是10,因为没有save
>>reporter.save() # 保存之后才会去更改数据库
>>reporter.stories_filed
11
F()函数
>>from django.db.models import F
>>reporter = Reporters.objects.get(name='Tintin')
>>reporter.stories_filed
10
>>reporter.stories_filed = F('stories_filed') + 1
>>reporter.stories_filed
10
>>reporter.save()
>>reporter.stories_filed
10
>>reporter = Reporters.objects.get(name='Tintin') # 重新载入实例之后就是最新的数据
>>reporter.stories_filed
11
F()函数配合update可以优化效率,不再需要使用get()和save()方法
更新单个实例
reporter = Reporters.objects.filter