Por José Lopes
Este artigo mostra como ordenar uma QuerySet usando case insensitive.
No Django, quando utilizamos o método order_by numa QuerySet o resultado é case sensitive por defeito e não existe nenhuma opção para mudar isto.
Para garantir que o resultado é case insensitive podemos usar o método extra, criando um atributo adicional que utilize o campo do modelo em causa juntamente com a função LOWER ou UPPER do SQL, e depois ordenar por este atributo:
MeuModel.objects.all().extra(select={'minha_ordem':'LOWER(campo_do_modelo)'}).order_by('minha_ordem')
As funções LOWER e UPPER do SQL estão disponíveis na maiorida das base de dados como podemos constatar no Wikibook SQL dialects reference (em inglês).
É claro que esta solução pode ser utilizada em qualquer QuerySet, eu só usei o método all para simplificar.
Na minha opinião esta é uma boa solução. Pode ser utilizada em qualquer campo do modelo e não polui a base de dados com informação desnecessária (como seria o caso se fosse criado um campo adicional, utilizando um custom manager ou o método save do modelo, para ser utilizado somente pelo order_by). Esta solução também evita a configuração da base de dados para garantir o mesmo resultado.