Django1.1模型字段值在返回前进行​​预处理

时间:2010-04-04 03:19:47

标签: python django django-models

我有一个这样的模型类:

class Note(models.Model):
    author = models.ForeignKey(User, related_name='notes')
    content = NoteContentField(max_length=256)

NoteContentField CharField 的自定义子类,它覆盖 to_python 方法,目的是进行一些Twitter文本转换处理。

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 个答案:

答案 0 :(得分:1)

我认为你应该为 to_python 提供反向功能。

在这里查看Django doc:Converting Python objects to query value

答案 1 :(得分:1)

您似乎只阅读了一半的文档。正如Pierre-Jean所述,甚至将您链接到文档的正确部分,您需要定义反向函数,即get_db_prep_value