django-models - 非字符串类型存储在 CharField 中

django-models - a non-string type is stored into CharField

我在 Python 3 和 MySQL 5.7 上使用 Django 1.11。

假设我有一个带有 CharField 的模型,如下所示:

class ModelA(models.Model):

    ID = models.AutoField(primary_key=True)
    a = models.CharField()

在 shell 中,我尝试这样做:

>>> instance = ModelA(a={'1' : 1})
>>> instance

这给了我一个 TypeError: __str__ returned non-string (type dict)

但是当我这样做时:

>>> instance.save()

我没有收到任何错误。

如果我尝试:

>>> instance.a
{'1': 1}

但是当我尝试时:

>>> ModelA.objects.get(ID=<the ID of the above instance>).a
"{'1': 1}"

这意味着它作为字符串存储在数据库中table。

我的问题是为什么会发生这种隐式转换,为什么 save() 不像 __str__() 那样引发错误?

感谢您的帮助!

模型实例只是一个 python 对象。您可以将任何属性设置为任何值。

当您保存实例时,所有数据都会转换为适当的数据类型,以发挥 Django 的最佳能力。对于 CharField,这意味着任何真实值(str(value) 为 True)都保存在数据库中

保存模型时,会读取字段的当前值,将其转换为适当的数据类型,然后保存到数据库中。

TypeError: `__str__` returned non-string (type dict) 

因为转换前。保存数据后,Django 会将类型更改为 str,因此保存实例后不会出现错误。

使用 JSONField 如果你想保存 Dict 类型的对象并确保你使用的是 Postgres DB。