如何在Django Rest Framework中将JSON的type字段映射为自定义序列化字段
将JSON的
type字段映射到DRF序列化器的sale_type字段 我明白你的需求——不想在序列化器里使用Python内置关键字type作为字段名,但又要能正确解析输入JSON中的type字段。这里有两种靠谱的解决方案,你可以根据自己的需求选择:
方案1:使用source参数快速映射
这是最简单的方法,直接在sale_type字段上指定source='type',告诉DRF从输入JSON的type字段读取值,赋值给序列化器的sale_type:
from rest_framework import serializers from rest_framework.validators import MaxValueValidator, MinValueValidator class SaleSerializer(serializers.Serializer): TYPE_CHOICES = ['profit', 'cost'] sale_type = serializers.ChoiceField( choices=TYPE_CHOICES, source='type' # 核心:指定输入JSON的字段名 ) value = serializers.IntegerField( validators=[MaxValueValidator(limit_value=10000), MinValueValidator(limit_value=0)], allow_null=False )
注意点:
- 反序列化时,
serializer.validated_data里的键会是type而不是sale_type,因为source参数指定了数据源的名称。如果你只是不想在序列化器定义里用type,这个方案完全够用。 - 如果需要在序列化输出(比如返回给前端的JSON)中仍然显示
type而不是sale_type,不需要额外处理——因为source会自动把sale_type对应的值输出为type字段。
方案2:重写to_internal_value完全自定义映射
如果你希望validated_data里的键也是sale_type(彻底避开type这个关键字),可以重写序列化器的to_internal_value方法,手动处理字段的重命名:
from rest_framework import serializers from rest_framework.validators import MaxValueValidator, MinValueValidator class SaleSerializer(serializers.Serializer): TYPE_CHOICES = ['profit', 'cost'] sale_type = serializers.ChoiceField(choices=TYPE_CHOICES) value = serializers.IntegerField( validators=[MaxValueValidator(limit_value=10000), MinValueValidator(limit_value=0)], allow_null=False ) def to_internal_value(self, data): # 把输入JSON中的`type`字段重命名为`sale_type` if 'type' in data: data['sale_type'] = data.pop('type') # 调用父类方法完成后续验证 return super().to_internal_value(data)
额外处理序列化输出(可选)
如果需要在返回的JSON中仍然输出type而不是sale_type,可以再重写to_representation方法:
def to_representation(self, instance): data = super().to_representation(instance) # 把`sale_type`重命名回`type`后返回 data['type'] = data.pop('sale_type') return data
这样不管是输入还是输出,JSON里都是type,但序列化器内部全程用sale_type,完美避开关键字问题。
内容的提问来源于stack exchange,提问作者Kha Nguyễn
相关产品推荐
相关产品推荐

