Django在Coalesce语句中将char('')清空为null(NULL)

gab*_*n88 4 django django-orm

我有以下要执行的查询:

MyModel.objects.annotate(current_name=Coalesce('nickname', 'name')).order_by('current_name') 
Run Code Online (Sandbox Code Playgroud)

因为昵称在空时不是NULL,但是它是一个空的char(就像Django社区中的惯例一样).

所以我想做的事情如下:

MyModel.objects.annotate(if empty char: make null, then do coalesce like above). Is this possible?
Run Code Online (Sandbox Code Playgroud)

Bog*_*oie 7

使用条件表达式,这是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')
Run Code Online (Sandbox Code Playgroud)