Django: упорядочивание численного значения с order_by

Я нахожусь в ситуации, где я должен произвести довольно большой список объектов CharField, используемым для хранения конкретных адресов.

Моя проблема, это, очевидно, данные заказаны кодами ASCII, так как это - Чарфилд с предсказуемыми результатами.. это сортирует числа как это;

1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 21....

Теперь очевидный шаг должен был бы изменить Чарфилд надлежащий тип поля (IntegerField скажем), однако он не может работать, так как некоторый адрес мог бы иметь квартиры.. как "128 А".

Я действительно не знаю, как я могу заказать это правильно..

18
задан h3. 3 June 2010 в 20:03
поделиться

2 ответа

Если вы уверены, что в поле есть только целые числа, вы можете заставить базу данных преобразовать его как целое число с помощью метода extra , и в этом порядке:

MyModel.objects.extra(
    select={'myinteger': 'CAST(mycharfield AS INTEGER)'}
).order_by('myinteger')
23
ответ дан 30 November 2019 в 06:19
поделиться

Проблема, с которой вы столкнулись, очень похожа на то, как имена файлов упорядочиваются при сортировке по имени файла. Здесь вы хотите, чтобы «2 Foo.mp3» отображалось перед «12 Foo.mp3».

Обычный подход состоит в том, чтобы «нормализовать» числа для расширения до фиксированного числа цифр, а затем сортировку на основе нормализованной формы. То есть для сортировки «2 Foo.mp3» может быть расширен до «0000000002 Foo.mp3».

Django здесь напрямую не поможет. Вы можете либо добавить поле для хранения «нормализованного» адреса и иметь базу данных order_by , либо вы можете выполнить произвольную сортировку в вашем представлении (или в помощнике, который ваше представление использует) для записей адресов перед передачей списка записей в шаблон.

2
ответ дан 30 November 2019 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: