Django - Как отсортировать набор запросов по количеству символов в поле

MyModel:

name = models.CharField(max_length=255)

Я пытаюсь сортировать запрос. Я просто думаю об этом:

obj = MyModel.objects.all().sort_by(-len(name)) #???

Любая идея?

Ответ 1

вам, возможно, придется сортировать это в python..

sorted(MyModel.objects.all(),key=lambda o:len(o.name),reverse=True)

или я соврал (быстрый поиск в Google обнаружил следующее)

MyModel.objects.extra(select={'length':'Length(name)'}).order_by('length')

Ответ 2

Новая горячая точка (от Django 1.8 или около того) Length()

from django.db.models.functions import Length
obj = MyModel.objects.all().order_by(Length(name).asc())

Ответ 3

Конечно, вы можете отсортировать результаты с помощью Python sorted, но это не идеально. Вместо этого вы можете попробовать следующее:

MyModel.objects.extra(select={'length':'Length(name)'}).order_by('length')

Ответ 4

Вам нужно использовать аргумент extra для передачи функции SQL:

obj = MyModel.objects.all().extra(order_by=['LENGTH(`name`)']) 

Обратите внимание, что это db-specific: MySQL использует LENGTH, другие могут использовать LEN.