djangoのorder_byで、NULL値や空値をリストの最後や先頭に持ってくるようコントロールしたい場合について。
codeフィールドのソートを考えます。
codeフィールドがCharField(null=True, blank=True)の場合:
from django.db.models.functions import Length
MyModel.objects.all().annotate(code_len=Length(‘code’)).order_by(‘-code_len’, ‘code’)
上記のSQLコードは
SELECT “code” LENGTH(“code”) AS “code_len” FROM “my_table” ORDER BY “code_len” DESC, “code” ASC;
試してないけど、codeフィールドがIntegerField(null=True, blank=True)の場合:
from django.db.models import Count
MyModel.objects.all().annotate(code_num=Count(‘code’)).order_by(‘-code_num’, ‘code’)
annotateでフィールドの長さや数をエイリアスとして追加し、それを1つ目のソート対象とし、2つ目に元々ソートしたいフィールドを指定しています。CharはLengthで、IntegerはCountで処理する感じです。
後でもっと詳しく書くかも書かないかも。