Django1.1模型字段值返回前预处理

1 投票
2 回答
770 浏览
提问于 2025-04-15 21:12

我有一个模型类,长得像这样:

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()

转换后的值被保存到了数据库里,这并不是我想要的结果。

我想做的是把原始内容保存到数据库中,只有在后面访问内容属性时才进行转换。

请问这其中出了什么问题呢?

感谢 Pierre 和 Daniel 的帮助。

我已经找到了问题所在。

我原以为文本转换的代码应该放在 to_pythonget_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

我觉得你应该给to_python这个函数提供一个反向的功能。

可以看看Django的文档,这里有个链接:将Python对象转换为查询值

1

看起来你只看了一半的文档。正如Pierre-Jean上面提到的,并且还给你链接到了文档的正确部分,你需要定义一个叫做get_db_prep_value的反向函数。

撰写回答