Depuis Django 1.8 order_by()
accepte non seulement les noms de champs mais aussi les expressions de requête .
Dans une autre réponse J'ai donné un exemple de la manière dont vous pouvez remplacer le classement par défaut d'une colonne. L'expression de requête utile ici est Func() , que vous pouvez sous-classer ou utiliser directement :
nimi_et = Func(
'nimi',
function='et_EE',
template='(%(expressions)s) COLLATE "%(function)s"')
Test.objects.order_by(nimi_et.asc())
Cependant, notez que le SQL résultant ressemblera davantage à :
SELECT nimi FROM test ORDER BY nimi COLLATE "et_EE" ASC;
Autrement dit, le classement est remplacé dans ORDER BY
clause plutôt que dans SELECT
clause. Cependant, si vous avez besoin de l'utiliser dans un WHERE
clause, vous pouvez utiliser Func()
dans annotate()
.