Изменить способ, которым Django Admin сортирует целые числа? - PullRequest
0 голосов
/ 13 июля 2010

Модель имеет IntegerField с null=True, blank=True, поэтому поле может иметь значение None.Когда столбец сортируется, Nones всегда обрабатываются как самые низкие значения.Можно ли заставить Джанго относиться к ним как к самым высоким ценностям?Таким образом, при сортировке в порядке убывания вместо:

100 43 7 Нет

Будет:

Нет 100 43 7

Я понимаю, что могназначьте чрезвычайно большое число вместо None, но ради аккуратности мне было интересно, есть ли другие варианты.

Спасибо!

Ответы [ 3 ]

1 голос
/ 14 июля 2010

Даниэль прав в том, что база данных определяет порядок сортировки, а разные базы данных по-разному обрабатывают порядок 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')

Однако, если вы хотите, чтобы это был порядок по умолчанию для использования в админке и т. Д., Вам потребуется другой подход, возможно, через переопределение менеджера.

0 голосов
/ 13 августа 2010

Поскольку я использую Django 1.1 и не могу использовать raw(), самым простым способом оказалось создание поля "int_sort" и заполнение его значением IntegerField, если только оно не встретило None, в этом случае оно будет принимать значение sys.maxint.

Затем в admin.py я установил admin_order_field в поле "int_sort".

0 голосов
/ 14 июля 2010

Порядок сортировки определяет не Django, а база данных. И базы данных имеют свои собственные правила сортировки NULL.

Одной (довольно сложной) возможностью было бы реализовать настраиваемое поле , которое использует собственный тип базы данных для сортировки в правильном порядке. Детали того, как вы это сделаете, могут зависеть от вашей базы данных.

...