django order_by null first or null last

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で処理する感じです。
後でもっと詳しく書くかも書かないかも。

 

コメントを残す

メールアドレスが公開されることはありません。