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.

Другие вопросы по тегам