Django: приведите CharField к Integer, если это возможно - PullRequest
1 голос
/ 25 марта 2020

У меня есть следующий код для преобразования поля my_field в целое число для сортировки.

self.object_list = self.object_list.annotate(order_field=Cast('my_field', IntegerField())) \
                                   .order_by('order_field')

Проблема состоит в том, что некоторые поля данных могут быть не нумерованными c, из-за которых оно выбрасывает ошибка. Есть ли способ к Cast только если возможно?

Я ищу два случая -

  1. Вернуть полный object_list, упорядочив те, которые возможны, и сохранив остальные в начале / конце.
  2. Возвращает только object_list, где my_field может быть приведено к целому числу

1 Ответ

1 голос
/ 25 марта 2020

Есть ли способ разыграть, только если это возможно

Вы можете попробовать использовать extra :

self.object_list.extra(
    where=[
       "ISNUMERIC(my_field) = 1"
    ]
).annotate(
    order_field=Cast('my_field', IntegerField())
).order_by('order_field')

Это решит ваши ( 2) требование и чтобы выполнить (1), вы можете использовать тот же запрос с изменением where на select (см. Документы), чтобы комментировать что-то вроде флага is_numeric, а затем упорядочить по order_field и is_numeric.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...