2015-06-27 63 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()并在此处移动您的逻辑。