一、查询表达式
查询表达式描述可用作于更新,创建,过滤,排序,注释或聚合的一部分的值的计算。这里(文档中)有很多内置表达式可以帮助你完成自己的查询。 表达式可以组合,甚至是嵌套,来完成更加复杂的计算
二、内置表达式
F() 表达式
一个 F()
对象代表了一个model的字段值或注释列。 使用它就可以直接参考model的field和执行数据库操作而不用再把它们(model field)查询出来放到python内存中。
相反,Django使用F()
对象生成描述数据库级所需操作的SQL表达式。
eg:
我们把 reporter.stories_filed
的值从数据库取出放到内存中并用我们熟悉的python运算符操作它,最后再把它保存到数据库
# Tintin filed a news story!
reporter = Reporters.objects.get(name='Tintin')
reporter.stories_filed += 1
reporter.save()
使用F()
from django.db.models import F
reporter = Reporters.objects.get(name='Tintin')
reporter.stories_filed = F('stories_filed') + 1
reporter.save()
虽然reporter.stories_filed = F('stories_filed') + 1
看起来像一个正常的Python分配值赋给一个实例属性,事实上这是一个描述数据库操作的SQL概念
当Django遇到一个F()
的实例时,它会覆盖标准的Python运算符来创建封装的SQL表达式;在这种情况下,指示数据库增加由reporter.stories_filed
表示的数据库字段。
无论reporter.stories_filed
的值是或曾是什么,Python一无所知--这完全是由数据库去处理的。 所有的Python,通过Django的F()
类,只是去创建SQL语法参考字段和描述操作。
要访问以这种方式保存的新值,必须重新加载该对象
F()
可以在对象实例的QuerySets
上使用,通过update()
。 这减少了我们上面使用的两个查询 -get()
和save()
- 只有一个
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) # 会将所有字段查询出来的值都+1