class Case(*cases, **extra)
[source]
A Case()
expression is like the if
... elif
... else
statement in Python
. Each condition
in the provided When()
objects is evaluated in order, until one evaluates to a truthful value. The result
expression from the matching When()
object is returned.
A simple example:
>>> >>> from datetime import date, timedelta >>> from django.db.models import CharField, 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%'), ... output_field=CharField(), ... ), ... ).values_list('name', 'discount') [('Jane Doe', '0%'), ('James Smith', '5%'), ('Jack Black', '10%')]
Case()
accepts any number of When()
objects as individual arguments. Other options are provided using keyword arguments. If none of the conditions evaluate to TRUE
, then the expression given with the default
keyword argument is returned. If a default
argument isn’t provided, None
is used.
If we wanted to change our previous query to get the discount based on how long the Client
has been with us, we could do so using lookups:
>>> 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%'), ... output_field=CharField(), ... ) ... ).values_list('name', 'discount') [('Jane Doe', '5%'), ('James Smith', '0%'), ('Jack Black', '10%')]
Please login to continue.