我有一个这样的模型类:
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
我想知道是否有更好的方法来实现它?
答案 0 :(得分:1)
我认为你应该为 to_python 提供反向功能。
在这里查看Django doc:Converting Python objects to query value
答案 1 :(得分:1)
您似乎只阅读了一半的文档。正如Pierre-Jean所述,甚至将您链接到文档的正确部分,您需要定义反向函数,即get_db_prep_value
。