如何在Django Rest Framework序列化器中映射含非字母数字字符的JSON键
解决Django ModelSerializer映射含特殊字符的JSON键问题
这个坑我之前踩过!确实常规的source参数在这里行不通,因为Python不允许属性名里包含-、=这类非字母数字字符,没法直接在Serializer里声明对应字段。给你两种实用的解决方案:
方案一:动态添加字段(最简洁)
利用Serializer的fields字典可以动态修改的特性,在初始化时添加对应特殊键的字段,直接映射到模型的my_key字段:
from rest_framework import serializers from .models import MyModel class MyModelSerializer(serializers.ModelSerializer): class Meta: model = MyModel fields = [] # 初始为空,后续动态添加 def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 动态添加带特殊字符的JSON键,映射到模型的my_key字段 self.fields["my-key="] = serializers.CharField(source="my_key")
这样不管是反序列化(前端传"my-key="字段)还是序列化(返回给前端"my-key="字段),都能自动完成映射,不需要额外处理逻辑。
方案二:重写序列化/反序列化方法(灵活可控)
如果需要对字段值做额外处理(比如格式转换、自定义校验),可以重写Serializer的to_internal_value(反序列化)和to_representation(序列化)方法:
from rest_framework import serializers from .models import MyModel class MyModelSerializer(serializers.ModelSerializer): class Meta: model = MyModel fields = ["my_key"] def to_internal_value(self, data): # 反序列化阶段:把JSON中的"my-key="转成模型的my_key字段 if "my-key=" in data: data["my_key"] = data.pop("my-key=") # 调用父类方法完成后续验证和转换 return super().to_internal_value(data) def to_representation(self, instance): # 序列化阶段:把模型的my_key转成JSON中的"my-key="字段 representation = super().to_representation(instance) representation["my-key="] = representation.pop("my_key") return representation
这个方法的优势是可以在转换前后加入自定义逻辑,比如对my-key=的值做清洗、特殊校验等操作。
内容的提问来源于stack exchange,提问作者roob
相关产品推荐
相关产品推荐

