gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:04:02 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com