Da Django 1.8 order_by()
accetta non solo i nomi dei campi ma anche le espressioni di query .
In un'altra risposta Ho fornito un esempio di come è possibile ignorare le regole di confronto predefinite per una colonna. L'utile espressione di query qui è Func() , che puoi sottoclassare o utilizzare direttamente:
nimi_et = Func(
'nimi',
function='et_EE',
template='(%(expressions)s) COLLATE "%(function)s"')
Test.objects.order_by(nimi_et.asc())
Tuttavia, nota che l'SQL risultante sarà più simile a:
SELECT nimi FROM test ORDER BY nimi COLLATE "et_EE" ASC;
Ovvero, le regole di confronto vengono sovrascritte in ORDER BY
clausola anziché in SELECT
clausola. Tuttavia, se hai bisogno di usarlo in un WHERE
clausola, puoi usare Func()
in annotate()
.