python - 从 Django 1.4 到 Django 2.1.5 : custom field to_python() not called anymore

标签 python django

我正在将应用程序从 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/

相关文章:

python - 为什么没有打印任何行并且估计系数为 NaN?

python - 如何使用 Xpath 在 iframe 中选择元素?

django - 为什么 Django REST Framework 的 HyperlinkedModelSerializer 不能形成 URL?

python - 如何在 Django 中创建预定帖子?

Django 模型 : default datetime is not translated into SQL CURRENT_TIMESTAMP

Python 错误 : X() takes exactly 1 argument (8 given)

python - pandas 中坐标对之间的距离

Python 多处理在 linux 中有效,但在 windows 中无效

python - 连接到 Docker 容器上的 PostgreSQL 数据库

django - 如何从 Heroku 上的 Django 项目正确地提供我的 Angular 应用程序静态文件?