Предварительная обработка значения поля модели Django1.1 перед возвратом - PullRequest
1 голос
/ 04 апреля 2010

У меня есть такой класс модели:

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

Интересно, есть ли лучший способ реализовать это?

Ответы [ 2 ]

1 голос
/ 04 апреля 2010

Вы, кажется, прочитали только половину документов. Как заметил Пьер-Жан выше и даже связал вас с правильной частью документа, вам нужно определить обратную функцию, которая является get_db_prep_value.

1 голос
/ 04 апреля 2010

Я думаю, что вы должны предоставить обратную функцию для to_python .

Взгляните на документ Django здесь: Преобразование объектов Python в значение запроса

...