Django-как сортировать queryset по количеству символов в поле

MyModel:

name = models.CharField(max_length=255)

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

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

есть идеи?

4 ответов


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

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

или я солгал (быстрый поиск google нашел следующее)

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

новая горячность (начиная с Django 1.8 или около того) -длина()

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

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

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

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

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

обратите внимание, что это специфично для БД: MySQL использует LENGTH, другие могут использовать LEN.