本文介绍 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')]>
相关用法
- Python Django Cast用法及代码示例
- Python Calendar itermonthdays2()用法及代码示例
- Python Calendar monthdatescalendar()用法及代码示例
- Python Calendar itermonthdates()用法及代码示例
- Python Calendar iterweekdays()用法及代码示例
- Python Calendar monthdayscalendar()用法及代码示例
- Python Calendar itermonthdays3()用法及代码示例
- Python Calendar yeardatescalendar()用法及代码示例
- Python Django CallbackFilter用法及代码示例
- Python Calendar itermonthdays()用法及代码示例
- Python Calendar yeardayscalendar()用法及代码示例
- Python Calendar yeardays2calendar()用法及代码示例
- Python Calendar itermonthdays4()用法及代码示例
- Python Calendar monthdays2calendar()用法及代码示例
- Python OpenCV Canny()用法及代码示例
- Python Tableau CSVRequestOptions用法及代码示例
- Python Django ContentTypeManager用法及代码示例
- Python Condition release()用法及代码示例
- Python Collections.UserString用法及代码示例
- Python Condition notify()用法及代码示例
- Python CSV转JSON用法及代码示例
- Python Django ContextMixin.get_context_data用法及代码示例
- Python Django CustomUserManager.create_user用法及代码示例
- Python Condition wait()用法及代码示例
- Python Django Coalesce用法及代码示例
注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.db.models.expressions.Case。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。