当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python Django Case用法及代码示例


本文介绍 django.db.models.expressions.Case 的用法。

声明

class Case(*cases, **extra)

Case() 表达式类似于 Python 中的 if elif else 语句。提供的When() 对象中的每个condition 都按顺序进行评估,直到评估为真实值。返回匹配的When() 对象中的result 表达式。

一个例子:

>>>
>>> from datetime import date, timedelta
>>> from django.db.models import Case, Value, When
>>> Client.objects.create(
...     name='Jane Doe',
...     account_type=Client.REGULAR,
...     registered_on=date.today() - timedelta(days=36))
>>> Client.objects.create(
...     name='James Smith',
...     account_type=Client.GOLD,
...     registered_on=date.today() - timedelta(days=5))
>>> Client.objects.create(
...     name='Jack Black',
...     account_type=Client.PLATINUM,
...     registered_on=date.today() - timedelta(days=10 * 365))
>>> # Get the discount for each Client based on the account type
>>> Client.objects.annotate(
...     discount=Case(
...         When(account_type=Client.GOLD, then=Value('5%')),
...         When(account_type=Client.PLATINUM, then=Value('10%')),
...         default=Value('0%'),
...     ),
... ).values_list('name', 'discount')
<QuerySet [('Jane Doe', '0%'), ('James Smith', '5%'), ('Jack Black', '10%')]>

Case() 接受任意数量的 When() 对象作为单独的参数。其他选项使用关键字参数提供。如果没有条件评估为 TRUE ,则返回带有 default 关键字参数的表达式。如果未提供 default 参数,则使用 None

如果我们想根据 Client 的使用时间更改之前的查询以获取折扣,我们可以使用查找来实现:

>>> a_month_ago = date.today() - timedelta(days=30)
>>> a_year_ago = date.today() - timedelta(days=365)
>>> # Get the discount for each Client based on the registration date
>>> Client.objects.annotate(
...     discount=Case(
...         When(registered_on__lte=a_year_ago, then=Value('10%')),
...         When(registered_on__lte=a_month_ago, then=Value('5%')),
...         default=Value('0%'),
...     )
... ).values_list('name', 'discount')
<QuerySet [('Jane Doe', '5%'), ('James Smith', '0%'), ('Jack Black', '10%')]>

注意

请记住,条件是按顺序计算的,因此在上面的示例中,即使第二个条件同时匹配 Jane Doe 和 Jack Black,我们也会得到正确的结果。这就像 Python 中的 if elif else 语句一样工作。

Case() 也适用于 filter() 子句。例如,要查找注册超过一个月的黄金客户和注册超过一年的白金客户:

>>> a_month_ago = date.today() - timedelta(days=30)
>>> a_year_ago = date.today() - timedelta(days=365)
>>> Client.objects.filter(
...     registered_on__lte=Case(
...         When(account_type=Client.GOLD, then=a_month_ago),
...         When(account_type=Client.PLATINUM, then=a_year_ago),
...     ),
... ).values_list('name', 'account_type')
<QuerySet [('Jack Black', 'P')]>

相关用法


注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.db.models.expressions.Case。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。