2015-06-27 74 views
2

所以,我製作了類似this answer的類。它看起來像:Django中的自定義字段get_prep_value()沒有效果

class TruncatingCharField(models.CharField): 
    description = _("String (truncated to %(max_length)s)") 

    def get_prep_value(self, value): 
     value = super(TruncatingCharField, self).get_prep_value(value) 
     if value: 
      value = value[:self.max_length] 
     return value 

我期望用字符串長於閾值的實例化此字段的模型應引發截斷。然而,這似乎不是這樣的情況:

class NewTruncatedField(models.Model): 
    trunc = TruncatingCharField(max_length=10) 


class TestTruncation(TestCase): 

    def test_accepted_length(self): 
     trunc = 'a'*5 
     obj = NewTruncatedField(trunc=trunc) 
     self.assertEqual(len(obj.trunc), 5) 

    def test_truncated_length(self): 
     trunc = 'a'*15 
     obj = NewTruncatedField(trunc=trunc) 
     self.assertEqual(len(obj.trunc), 10) 

第一測試通過,正如所預料的,但第二失敗,因爲該字段不截斷其值。 get_prep_value()方法肯定被調用(通過斷點測試),並且返回點處的輸出value被正確截斷。

那麼爲什麼obj對象中的字段值未被截斷?

回答

3

我相信get_prep_value()隻影響保存到數據庫的內容,而不是Python對象的內部值。

嘗試覆蓋to_python()並在此處移動您的邏輯。

相關問題