Ошибка типа при попытке сериализации JSON настраиваемого поля модели Django
Я написал пользовательское поле модели Django для хранения dateutil.relativedelta
"S. Поле выглядит так:
class RelativeDeltaField(models.CharField):
description = "Relative delta"
__metaclass__ = models.SubfieldBase
max_length = 200
def __init__(self, *args, **kwargs):
kwargs['max_length'] = self.max_length
super(RelativeDeltaField, self).__init__(*args, **kwargs)
def to_python(self, value):
if isinstance(value, relativedelta):
return value
try:
return eval(value)
except SyntaxError, e:
logging.error("Mangled data for a relativedelta field. Was the data truncated in MySQL column? Either manually fix, or change the next line to 'return None' and manually fix. value=%r message=%r" % (value, e))
raise
def get_db_prep_save(self, value, connection):
return repr(value)
def value_to_string(self, obj):
value = self._get_val_from_obj(obj)
return self.get_prep_value(value)
Я пытаюсь сериализовать объект с этим полем в JSON с:
serializers.serialize('json', obj)
Но я получаю ошибку:
…
File "/home/rory/tix/virtualenv/lib/python2.6/site-packages/django/core/serializers/json.py", line 58, in default
return super(DjangoJSONEncoder, self).default(o)
File "/usr/lib/python2.6/dist-packages/simplejson/encoder.py", line 190, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: relativedelta(hours=+1) is not JSON serializable
От использования pdb
, Я могу увидеть это o
в данном случае это сам объект, он ни к чему не преобразован и не сериализован.
Как я могу это исправить, чтобы я мог сериализовать свое поле?
Документация Django говорит ( https://docs.djangoproject.com/en/dev/howto/custom-model-fields/) добавить value_to_string
, который у меня есть.
1 ответ
Код в документе - это просто шаблон, который нужно реализовать value_to_string
вернуть строку, представляющую relativedelta
,
RelativeDeltaField
основывается на models.CharField
, Таким образом get_prep_value()
похоже
def get_prep_value(self, value):
return self.to_python(value)
Это нормально для CharField
потому что предполагаемое значение в Python поля уже является строкой. Тем не менее, ваша настроенная версия to_python()
возвращается relativedelta
вместо строки.