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。
我在 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。