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

In Django REST control serializer does not automatically remove spaces?

model.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'} 于是数据库中的空格就消失了。
如何保留空格?

您可以通过实施方法 to_representation()

自定义该字段的输出

来自DRF docs on CharField

trim_whitespace - If set to True then leading and trailing whitespace is trimmed. Defaults to True.

所以需要自己将这个flag传给serializer字段,设置为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 仍会从模型中正确选取其他属性。

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

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

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