Django IntegerField возвращает строку (!) - как привести к int?

У меня есть IntegerField, объявленный в модели, как показано ниже:

amount = models.IntegerField()

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

Это кажется мне немного удивительным: было бы хорошо, если бы IntegerField приводил свое значение к целому числу при присвоении (или, самое позднее, при сохранении), чтобы пользователь мог полагаться на то, что это целое число.

(Мое приложение использует sqlite.)

Есть ли способ заставить IntegerField возвращать только целые числа? Или для этого нужно создать настраиваемое поле?


person Marcin    schedule 22.02.2012    source источник
comment
Попробуйте снова извлечь объект из базы данных и посмотреть, является ли он целым числом. Насколько я помню, входя в базу данных, Django ORM будет вызывать repr() для объектов, поэтому, похоже, он нормально сохраняется.   -  person    schedule 22.02.2012
comment
@NathanHoad: Спасибо. Я попробую это, но это не совсем удовлетворительно :(   -  person Marcin    schedule 22.02.2012
comment
Downvoter: Хочешь раскрыть себя?   -  person Marcin    schedule 22.02.2012
comment
@Марчин, да, это немного раздражает, когда такое происходит. Самым быстрым решением было бы найти источник строки и превратить его в int - для меня это указывало бы на то, что ранее в проверке было что-то не так, что должно было это выявить.   -  person    schedule 22.02.2012
comment
что не так со старым добрым amount = int(models.IntegerField())? :)   -  person Kimvais    schedule 22.02.2012
comment
@NathanHoad: Согласен, и действительно, я исправил это таким образом.   -  person Marcin    schedule 22.02.2012
comment
@Kimvais: я бы предпочел выразить это в бесточечном стиле;)   -  person Marcin    schedule 22.02.2012
comment
@Kimvais, нет ничего плохого в том, чтобы вернуть его обратно к int, как таковому, это просто проблема с симптомом, а не с корневой проблемой.   -  person    schedule 22.02.2012
comment
@Marcin Я добавил это как ответ для будущих читателей, если вы хотите отметить это правильно :)   -  person    schedule 22.02.2012
comment
@NathanHoad: я всегда жду день, чтобы принять ответы, на случай, если будет опубликовано что-то еще лучшее!   -  person Marcin    schedule 22.02.2012
comment
@Marcin Звучит справедливо для меня! :)   -  person    schedule 22.02.2012


Ответы (1)


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

Самое быстрое решение (и самое простое в долгосрочной перспективе) для такого рода проблем — найти источник строки и превратить его в int — для меня это указывало бы на то, что ранее в проверке было что-то не так, что должно было это выявить. .

person Community    schedule 22.02.2012
comment
Моя проблема заключалась в том, что значение пришло из формы в виде строки и было сохранено в новый объект. Затем, используя этот новый объект, я пытался выполнить математику, но объект вернул строку, даже если в базе данных это было целое число. - person citadelgrad; 28.04.2017