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() .