Я использую настраиваемое поле Django для представления данных в кодировке JSON:
class JSONField(models.TextField):
__metaclass__ = models.SubfieldBase
def to_python(self, value):
if value == "":
return None
try:
if isinstance(value, basestring):
return json_decode(value)
except ValueError:
pass
return value
def get_prep_value(self, value):
if value == "":
return None
if isinstance(value, dict) or isinstance(value, dict):
value = json_encode(value)
return super(JSONField, self).get_prep_value(value)
def value_to_string(self, obj):
value = self._get_val_from_obj(obj)
return self.get_db_prep_value(value,connection=None)
Само поле работает нормально. Однако редактирование через сайт администратора невозможно, поскольку строка из базы данных декодируется в формате JSON и преобразуется в словарь, поэтому при отображении сайта администратора не отображается фактическая строка JSON из базы данных (например, {"foo": "bar"}), но его словарное представление (например, {u'foo ': u'bar'}).
Очевидно, это приводит к проблемам при сохранении объекта базы данных, поскольку строковое представление словаря не является допустимой строкой JSON.
Я бы хотел, чтобы сайт администратора отображал фактическое значение базы данных (т.е. строку, сохраненную в базе данных) вместо строкового представления объекта Python, возвращаемого to_python.
Моей попыткой было бы написать для этого специальный виджет, который просто снова вызывает json_encode в словаре - но есть ли способ лучше?