关于django rest framework Serializer CharField保留空格,不自动trim

来源:互联网 发布:淘宝满包邮在哪里设置 编辑:程序博客网 时间:2024/06/06 13:02

在django reset frame work的 Serializer的CharField中,会自动去除空格,例如一个Serializer中有一个CharField,输入为"abcde       ",当你调用serializer.valdated_data时会发现变成了"abcde",有时候这种效果并不是我们想要的。通过调试跟踪发现CharField的run_validation方法中有如下代码:

    def run_validation(self, data=empty):        # Test for the empty string here so that it does not get validated,        # and so that subclasses do not need to handle it explicitly        # inside the `to_internal_value()` method.        if data == '' or (self.trim_whitespace and six.text_type(data).strip() == ''):#重点            if not self.allow_blank:                self.fail('blank')            return ''        return super(CharField, self).run_validation(data)

可以看到if data == '' or (self.trim_whitespace and six.text_type(data).strip() == '')这一行,如果self.trim_whitespace为True就会调用strip,这个self.trim_white_space来自哪里呢?继续跟进会发现CharField中的__init方法有如下代码:

    def __init__(self, **kwargs):        self.allow_blank = kwargs.pop('allow_blank', False)        self.trim_whitespace = kwargs.pop('trim_whitespace', True)//重点        self.max_length = kwargs.pop('max_length', None)        self.min_length = kwargs.pop('min_length', None)        super(CharField, self).__init__(**kwargs)

可以看到self.trim_whitespace来自于参数trim_whitespace,默认为True,所以在声明CharField时,传入这个参数并设为False就不会调用strip了,例如:username=serializers.CharField(trim_whitespace = False),输入"abcde      ",validated_data得到的还是"abcde      "。

个人觉得django rest framework的文档一点都不详细,很多东西必须看源码,文档比起django差远了

原创粉丝点击