django-models - в CharField сохраняется нестроковый тип
Я использую Django 1.11 на Python 3 и MySQL 5.7.
Предположим, у меня есть модель с CharField, вот так:
class ModelA(models.Model):
ID = models.AutoField(primary_key=True)
a = models.CharField()
И в оболочке я попытался сделать это:
>>> instance = ModelA(a={'1' : 1})
>>> instance
который дает мне TypeError: __str__ вернул не-строку (тип dict)
Но когда я делаю это:
>>> instance.save()
Я не получаю никакой ошибки.
Если я попробую:
>>> instance.a
{'1': 1}
Но когда я пытаюсь:
>>> ModelA.objects.get(ID=<the ID of the above instance>).a
"{'1': 1}"
Это означает, что он был сохранен в таблице базы данных в виде строки.
Мой вопрос: почему происходит это неявное преобразование, и почему save() не вызывает ошибку, как __str__()?
Спасибо за вашу помощь!
1 ответ
Экземпляр модели - это просто объект Python. Вы можете установить любой атрибут на любое значение.
При сохранении экземпляра все данные преобразуются в соответствующие типы данных в соответствии с наилучшими способностями Django. Для CharField это означает, что любое истинное значение (str (value) - True) сохраняется в базе данных.
При сохранении модели текущие значения поля считываются, преобразуются в соответствующий тип данных и сохраняются в базе данных.
TypeError: `__str__` returned non-string (type dict)
Это из-за до преобразования. После сохранения данных Django будет изменен на тип str
так что вы не получите ошибку после сохранения экземпляра.
Используйте JSONField. Если вы хотите сохранить объект типа Dict и убедиться, что вы используете Postgres DB.