2010-04-04 19 views
1

之前,我有一個這樣的模型類:Django1.1模型字段值預處理返回

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(author=request.use, 
      content=form.cleaned_data['content']) 
note.save() 

的交談值保存到數據庫中,這不是我想看到的。

我想要做的是將原始內容保存到數據庫中,並且只在稍後訪問內容屬性時進行轉換。

你能告訴我這有什麼問題嗎?

感謝皮埃爾和丹尼爾。

我已經知道了什麼是錯的。

我想文本轉換代碼應該也在to_pythonget_db_prep_value,這是錯誤的。

我應該重寫他們兩個,讓to_python進行轉換和get_db_prep_value返回unconversed值:

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 

我不知道是否有實現這個更好的辦法?

回答

1

你似乎有隻讀一半的文檔。正如Pierre-Jean上文所述,甚至將您鏈接到文檔的正確部分,您需要定義相反的功能,即get_db_prep_value

+0

謝謝。你的意思是我必須同時定義to_python和get_db_prep_value來完成這個工作嗎?如果是這樣,get_db_prep_value方法應該是什麼? – satoru 2010-04-04 12:17:11

+0

你是對的,丹尼爾。這是一個恥辱,我沒有耐心閱讀手冊:( – satoru 2010-04-04 12:33:42

1

我想你應該提供相反的功能to_python

看看Django的文檔在這裏:Converting Python objects to query value

+0

這也行不通。 * to_python *用於將數據庫值轉換爲PYTHON對象,這就是我想要的。但是,轉換髮生兩次,一次存儲字段值,一次存儲該屬性。 – satoru 2010-04-04 11:50:36