Django 空字符 ('') 到 Coalesce 语句内的 null (NULL)
Django empty char ('') to null (NULL) inside a Coalesce statement
我想执行以下查询:
MyModel.objects.annotate(current_name=Coalesce('nickname', 'name')).order_by('current_name')
失败得很惨,因为 nickname 为空时不是 NULL,而是一个空字符(这是 Django 社区的惯例)。
因此我想做类似的事情:
MyModel.objects.annotate(if empty char: make null, then do coalesce like above). Is this possible?
使用 Conditional expressions,这是 Django 1.8 中的新功能。
from django.db.models import CharField, Case, When
from django.db.models.functions import Coalesce
MyModel.objects.annotate(
current_name=Coalesce(
Case(
When(nickname__exact='', then=None),
When(nickname__isnull=False, then='nickname'),
default=None,
output_field=CharField()
),
Case(
When(name__exact='', then=None),
When(name__isnull=False, then='name'),
default=None,
output_field=CharField()
))).order_by('current_name')
我想执行以下查询:
MyModel.objects.annotate(current_name=Coalesce('nickname', 'name')).order_by('current_name')
失败得很惨,因为 nickname 为空时不是 NULL,而是一个空字符(这是 Django 社区的惯例)。
因此我想做类似的事情:
MyModel.objects.annotate(if empty char: make null, then do coalesce like above). Is this possible?
使用 Conditional expressions,这是 Django 1.8 中的新功能。
from django.db.models import CharField, Case, When
from django.db.models.functions import Coalesce
MyModel.objects.annotate(
current_name=Coalesce(
Case(
When(nickname__exact='', then=None),
When(nickname__isnull=False, then='nickname'),
default=None,
output_field=CharField()
),
Case(
When(name__exact='', then=None),
When(name__isnull=False, then='name'),
default=None,
output_field=CharField()
))).order_by('current_name')