Django中的自定义字段get_prep_value()无效

时间:2015-06-27 20:54:26

标签: django django-models

所以,我和this answer做了类似的课程。它看起来像:

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对象中的字段值不会被截断?

1 个答案:

答案 0 :(得分:3)

我相信get_prep_value()只影响保存到数据库的内容,而不影响Python对象的内部值。

尝试覆盖to_python()并将逻辑移到那里。