我在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 __()那样提出一个错误(?)?
感谢您的帮助!
答案 0 :(得分:1)
模型实例只是一个python对象。您可以将任何属性设置为任何值。
保存实例时,所有数据都会转换为适当的数据类型,达到Django的最佳能力。对于CharField,这意味着任何truthy值(str(value)为True)都保存在数据库中
保存模型时,将读取字段的当前值,将其转换为适当的数据类型,并保存到数据库中。
TypeError: `__str__` returned non-string (type dict)
因为在转换之前。保存数据后,Django会将类型更改为str
,这样您在保存实例后就不会收到错误。
使用JSONField如果要保存Dict类型的对象并确保使用Postgres DB。