一、查询表达式

查询表达式描述可用作于更新,创建,过滤,排序,注释或聚合的一部分的值的计算。这里(文档中)有很多内置表达式可以帮助你完成自己的查询。 表达式可以组合,甚至是嵌套,来完成更加复杂的计算

 

 二、内置表达式

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

 

posted on 2021-10-09 16:09  輪滑少年  阅读(330)  评论(0编辑  收藏  举报