You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 11:44:08