Pour Django 1.9 (et éventuellement 1.8), vous pouvez utiliser ceci :
from django.db import connections, models
from django.db.models.sql.compiler import SQLCompiler
class NullsLastSQLCompiler(SQLCompiler):
def get_order_by(self):
result = super().get_order_by()
if result and self.connection.vendor == 'postgresql':
return [(expr, (sql + ' NULLS LAST', params, is_ref))
for (expr, (sql, params, is_ref)) in result]
return result
class NullsLastQuery(models.sql.query.Query):
"""Use a custom compiler to inject 'NULLS LAST' (for PostgreSQL)."""
def get_compiler(self, using=None, connection=None):
if using is None and connection is None:
raise ValueError("Need either using or connection")
if using:
connection = connections[using]
return NullsLastSQLCompiler(self, connection, using)
class NullsLastQuerySet(models.QuerySet):
def __init__(self, model=None, query=None, using=None, hints=None):
super().__init__(model, query, using, hints)
self.query = query or NullsLastQuery(self.model)
Et ensuite sur votre (vos) modèle(s) :
objects = NullsLastQuerySet.as_manager()
Ceci est basé sur la réponse de Tim dans https://stackoverflow.com/a/17077587/15690 .
Le ticket pour ajouter ce support à Django a été réouvert : https://code.djangoproject.com/ticket/13312 .