2. Как упорядочить набор запросов без учета регистра?

../_images/usertable2.png

Всякий раз, когда мы пытаемся сделать order_by с некоторым строковым значением, упорядочивание происходит по алфавиту и регистру. Например,

>>> User.objects.all().order_by('username').values_list('username', flat=True)
<QuerySet ['Billy', 'John', 'Radha', 'Raghu', 'Ricky', 'Ritesh', 'johny', 'johny1', 'paul', 'rishab', 'sharukh', 'sohan', 'yash']>

Если мы хотим упорядочить набор запросов без учета регистра, мы можем поступить следующим образом.:

.. code-block:: ipython
>>> from django.db.models.functions import Lower
>>> User.objects.all().order_by(Lower('username')).values_list('username', flat=True)
<QuerySet ['Billy', 'John', 'johny', 'johny1', 'paul', 'Radha', 'Raghu', 'Ricky', 'rishab', 'Ritesh', 'sharukh', 'sohan', 'yash']>

В качестве альтернативы можно сделать аннотацию с помощью Lower и затем заказать по аннотированному полю.

User.objects.annotate(
    uname=Lower('username')
).order_by('uname').values_list('username', flat=True)
Вернуться на верх