我正在将应用程序从 python 2/Django 1.4 迁移到 python 3/Django 2.1.5。我对自定义 JSON 字段有一个奇怪的行为:
class JSONField(models.TextField):
"""JSONField is a generic textfield that neatly serializes/unserializes
JSON objects seamlessly. Main thingy must be a dict object."""
def __init__(self, *args, **kwargs):
if 'default' not in kwargs:
kwargs['default'] = '{}'
super().__init__(*args, **kwargs)
def to_python(self, value):
"""Convert our string value to JSON after we load it from the DB"""
if not value:
return {}
elif isinstance(value, str):
res = loads(value)
assert isinstance(res, dict)
return res
else:
return value
def get_db_prep_save(self, value, connection):
"""Convert our JSON object to a string before we save"""
if not value:
return super(JSONField, self).get_db_prep_save("", connection=connection)
else:
return super(JSONField, self).get_db_prep_save(dumps(value), connection=connection)
在 Django 1.4 中,当我从数据库中读取对象时会调用 JSONField.to_python(),但在 Django 2.1.5 中则不会:你知道为什么吗?
最佳答案
据我所知,每当您将对象实例保存到数据库时,都会调用 to_python
。此函数用于将值从给定类型转换为所需类型。来自方法的文档:
Convert the input value into the expected Python data type, raising django.core.exceptions.ValidationError if the data can't be converted. Return the converted value. Subclasses should override this.
例如在 TextField
中,to_python
函数如下所示:
def to_python(self, value):
if isinstance(value, str) or value is None:
return value
return str(value)
在这里,它将一个值转换为字符串,而不管其先前的类型。这意味着,您可以通过 TextField
传递一个整数值,但是当它被保存到数据库时,它将被转换为字符串。
最后,如果要使用JSONField,那么对于Postgresql,可以考虑使用JSONField由 django 提供。如果您使用的是 MySQL,那么您可以查看 django-mysql's JSONField .
关于python - 从 Django 1.4 到 Django 2.1.5 : custom field to_python() not called anymore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54596253/