0

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

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

class ModelA(models.Model):

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

在外壳中,我尝试这样做:

>>> 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}"

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

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

谢谢你的帮助!

4

1 回答 1

1

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

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

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

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

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

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

于 2018-04-12T12:23:29.290 回答