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

时间:2018-04-12 12:00:00

标签: python django django-models django-model-field

我在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__返回非字符串(类型dict)

但是当我这样做时:

>>> instance.save()

我没有收到任何错误。

如果我尝试:

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

但是当我尝试时:

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

这意味着它以字符串形式存储在数据库表中。

我的问题是为什么这种隐式转换会发生,以及为什么不会像__str __()那样提出一个错误(?)?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

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

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

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

因为在转换之前。保存数据后,Django会将类型更改为str,这样您在保存实例后就不会收到错误。

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