条件表达式 — Django 文档
条件表达式
条件表达式允许您在过滤器、注释、聚合和更新中使用 if
... elif
... else
逻辑。 条件表达式为表的每一行计算一系列条件并返回匹配的结果表达式。 条件表达式也可以像其他 表达式 一样组合和嵌套。
条件表达式类
我们将在后续示例中使用以下模型:
When
- class When(condition=None, then=None, **lookups)
When()
对象用于封装条件及其结果以供在条件表达式中使用。 使用 When()
对象类似于使用 filter() 方法。 可以使用 字段查找 或 Q 对象指定条件。 结果是使用 then
关键字提供的。
一些例子:
请记住,每个值都可以是一个表达式。
Case
- class Case(*cases, **extra)
Case()
表达式类似于 Python
中的 if
... elif
... else
语句。 提供的 When()
对象中的每个 condition
都按顺序进行评估,直到评估为真实值。 返回匹配的 When()
对象中的 result
表达式。
一个简单的例子:
Case()
接受任意数量的 When()
对象作为单独的参数。 使用关键字参数提供其他选项。 如果没有任何条件计算为 TRUE
,则返回带有 default
关键字参数的表达式。 如果未提供 default
参数,则使用 None
。
如果我们想根据 Client
与我们在一起的时间更改我们之前的查询以获取折扣,我们可以使用查找来实现:
笔记
请记住,条件是按顺序计算的,因此在上面的示例中,即使第二个条件与 Jane Doe 和 Jack Black 匹配,我们也会得到正确的结果。 这就像 Python
中的 if
... elif
... else
语句。
Case()
也适用于 filter()
子句。 例如,要查找一个多月前注册的黄金客户和一年多前注册的白金客户:
高级查询
条件表达式可用于注释、聚合、查找和更新。 它们也可以与其他表达式组合和嵌套。 这允许您进行强大的条件查询。
条件聚合
如果我们想知道每个 account_type
有多少个客户端怎么办? 我们可以使用 聚合函数 的 filter
参数来实现:
此聚合在支持它的数据库上使用 SQL 2003 FILTER WHERE
语法生成查询:
在其他数据库上,这是使用 CASE
语句模拟的:
这两个 SQL 语句在功能上是等效的,但更明确的 FILTER
可能会执行得更好。