Django1.1模型字段值返回前预处理
我有一个模型类,长得像这样:
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_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
我觉得你应该给to_python这个函数提供一个反向的功能。
可以看看Django的文档,这里有个链接:将Python对象转换为查询值
1
看起来你只看了一半的文档。正如Pierre-Jean上面提到的,并且还给你链接到了文档的正确部分,你需要定义一个叫做get_db_prep_value
的反向函数。