Даниэль прав в том, что база данных определяет порядок сортировки, а разные базы данных по-разному обрабатывают порядок NULL. Однако есть способы заставить БД выдать вам нужный вам заказ.
PostgreSQL достаточно хорош, чтобы фактически позволить вам добавлять «NULLS FIRST» или «NULLS LAST» к вашему запросу ( ref ).
SELECT * FROM table_name ORDER BY int_field DESC NULLS FIRST;
Для MySQL и SQLite есть альтернатива (которая также будет работать в PostgreSQL), как описано здесь . По сути, если вы хотите, чтобы значения null были последними, вы должны сделать:
SELECT *, int_field IS NULL AS is_null FROM table_name ORDER BY is_null DESC, int_field DESC;
Однако получение Django для выполнения этих запросов - совсем другая история. В Django 1.2 у менеджеров моделей теперь есть метод raw (), задокументированный здесь , который возвращает RawQuerySet, который похож на QuerySet, но не может быть сложен (например, вы не можете добавить фильтр ( ) позвони туда). Конечно, вместо суммирования вы можете просто добавить свои параметры поиска в SQL. Будет ли эта функция полезна для вас, зависит от того, чего вы пытаетесь достичь. Если вы просто хотите получить ваши модели в таком порядке, а затем передать набор запросов в представление или что-то еще, вы можете сделать:
YourModel.objects.raw('SELECT *, int_field IS NULL AS is_null FROM table_name ORDER BY is_null DESC, int_field DESC')
Однако, если вы хотите, чтобы это был порядок по умолчанию для использования в админке и т. Д., Вам потребуется другой подход, возможно, через переопределение менеджера.