在 Django REST 控件序列化程序中不会自动删除空格?

Posted

技术标签:

【中文标题】在 Django REST 控件序列化程序中不会自动删除空格?【英文标题】:In Django REST control serializer does not automatically remove spaces? 【发布时间】:2018-10-05 17:42:34 【问题描述】:

模型.py

class Msg(models.Model):
    content = models.CharField(max_length=1024, null=True)

serializer.py

class MessageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Msg
        fields = ["content"]

有数据:

"content": "   space    test    "

print(data)
serializer = MessageSerializer(data=data)
if serializer.is_valid():
    serializer.save()
    print(serializer.data)
    return True, serializer.data
else:
    return False, serializer.errors

第一次打印是 'content': ' space test ' 第二个打印是 'content': 'space test' 所以数据库中的空格消失了。 如何保留空格?

【问题讨论】:

请删除所有反引号 【参考方案1】:

来自DRF docs on CharField:

trim_whitespace - 如果设置为 True,则会修剪前导和尾随空格。默认为真。

所以你需要自己将这个标志传递给序列化器字段,并将其设置为False

class MessageSerializer(serializers.ModelSerializer):
    content = serializers.CharField(trim_whitespace=False, max_length=1024)
    class Meta:
        model = Msg
        fields = ["content"]

或更好地通过additional keyword arguments:

class MessageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Msg
        fields = ["content"]
        extra_kwargs = "content": "trim_whitespace": False

第二个变体更好,因为 DRF 仍然可以从模型中正确提取其他属性。

【讨论】:

【参考方案2】:

您可以通过实现 to_representation() 方法来自定义该字段的输出

【讨论】:

【参考方案3】:

您可以使用 django-rest-framework 序列化程序中给出的 trim_whitespace 选项。

class MessageSerializer(serializers.ModelSerializer):
    content = serializers.CharField(max_length=1024, trim_whitespace=True)

    class Meta:
        model = Msg
        fields = ["content"]

【讨论】:

以上是关于在 Django REST 控件序列化程序中不会自动删除空格?的主要内容,如果未能解决你的问题,请参考以下文章

序列化程序中的django rest框架更新方法,实例不会立即保存

从 django rest 框架中的序列化程序发送自定义错误响应?

Django Rest Framework 序列化程序中的自定义错误消息

如何自定义 Django Rest Framework 序列化程序输出?

django rest 框架序列化程序中的关系数据库

如何在 Django Rest Framework 中过滤嵌套的序列化程序?