У меня есть такой класс модели:
class Note(models.Model):
author = models.ForeignKey(User, related_name='notes')
content = NoteContentField(max_length=256)
NoteContentField - это пользовательский подкласс CharField , который переопределяет метод to_python в целях выполнения некоторой обработки преобразования твиттера текста.
class NoteContentField(models.CharField):
__metaclass__ = models.SubfieldBase
def to_python(self, value):
value = super(NoteContentField, self).to_python(value)
from ..utils import linkify
return mark_safe(linkify(value))
Однако это не работает.
Когда я сохраняю объект Note следующим образом:
note = Note(author=request.use,
content=form.cleaned_data['content'])
note.save()
Конвертированное значение сохраняется в базе данных, что я не хочу видеть.
Я пытаюсь сохранить исходный контент в базу данных и выполнить преобразование только при последующем доступе к атрибуту контента.
Скажите, пожалуйста, что с этим не так?
Спасибо Пьеру и Даниилу.
Я понял, что не так.
Я думал, что код преобразования текста должен быть либо to_python , либо get_db_prep_value , и это неправильно.
Я должен переопределить их оба, заставить to_python выполнить преобразование, а get_db_prep_value вернуть неконверсированное значение:
from ..utils import linkify
class NoteContentField(models.CharField):
__metaclass__ = models.SubfieldBase
def to_python(self, value):
self._raw_value = super(NoteContentField, self).to_python(value)
return mark_safe(linkify(self._raw_value))
def get_db_prep_value(self, value):
return self._raw_value
Интересно, есть ли лучший способ реализовать это?