django-orm регистронезависимый порядок

Я знаю, что могу запустить поиск без учета регистра в DJango ORM. Подобно,

User.objects.filter(first_name__contains="jake")
User.objects.filter(first_name__contains="sulley")
User.objects.filter(first_name__icontains="Jake")
User.objects.filter(first_name__icontains="Sulley")

А также, я могу получить их как

user_list = User.objects.all().order_by("first_name")
# sequence: (Jake, Sulley, jake, sulley)
user_list = User.objects.all().order_by("-first_name") # for reverse
# sequence: (sulley, jake, Sulley, Jake)

Есть ли прямой путь для нечувствительной к регистру выборки?? Как в я хочу последовательность как

# desired sequence: jake, Jake, sulley, Sulley

Если нет, то предложите лучший способ сделать это. Заранее спасибо.

4 ответа

Решение

Этот ответ устарел, проверьте решение ниже с django 1.8 ->

Я нашел решение, используя.extra

class MyModelName(models.Model):
   is_mine = models.BooleanField(default=False)
   name = models.CharField(max_length=100)


MyModelName.objects.filter( is_mine=1 ).extra(\
    select={'lower_name':'lower(name)'}).order_by('lower_name')

оригинальная ссылка:

http://naorrosenberg.blogspot.fi/2011/04/django-models-orderby-charfield-case.html

Начиная с Django 1.8 это возможно с:

from django.db.models.functions import Lower
MyModel.objects.order_by(Lower('myfield'))

https://code.djangoproject.com/ticket/6498

Это для postgresql, но, возможно, это будет полезно и для других баз данных:

http://scottbarnham.com/blog/2007/11/20/case-insensitive-ordering-with-django-and-postgresql/

Давайте рассмотрим пример, в котором вам нужно выполнить нечувствительный к регистру порядок в поле "first_name" из пользовательской модели.

      # Importing the Lower Function
from django.db.models.functions import Lower


#For ordering by Ascending order
User.objects.all().order_by(Lower('first_name'))

#For ordering by Descending order
User.objects.all().order_by(Lower('first_name').desc())

Функция Lower преобразует все значения "first_name" в нижний регистр, а затем упорядочивает их соответствующим образом.

Другие вопросы по тегам