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

Django DRF 如何调整Choice字段序列化返回值为显示名称

实现方法

默认DRF序列化Django choice字段时,默认返回数据库存储的原始值(即choice元组的第一个元素),要返回可读性更高的展示值,可通过以下几种方案实现:


方案1:使用SerializerMethodField自定义序列化(全版本兼容)

这种方案兼容性最好,所有DRF版本都支持,直接在序列化器中覆盖gender字段的序列化逻辑:

class PetSerializer(serializers.ModelSerializer):
    gender = serializers.SerializerMethodField()

    class Meta:
        model = Pet
        fields = "__all__"
    
    def get_gender(self, obj):
        # 调用Django自动生成的choice字段展示值获取方法
        return obj.get_gender_display()

方案2:通过source参数绑定展示方法(更简洁)

不需要额外写序列化方法,直接在字段定义时指定source为对应的展示方法即可:

class PetSerializer(serializers.ModelSerializer):
    gender = serializers.CharField(source='get_gender_display', read_only=True)

    class Meta:
        model = Pet
        fields = "__all__"

注意:如果同时需要支持提交gender字段的写入操作,可以把原gender字段重命名后保留,例如:

class PetSerializer(serializers.ModelSerializer):
    # 额外返回展示值,不影响原字段的读写逻辑
    gender_label = serializers.CharField(source='get_gender_display', read_only=True)

    class Meta:
        model = Pet
        fields = ["gender", "gender_label"]

这种实现下返回结果会同时携带原始值"gender": "M"和展示值"gender_label": "Male",兼顾接口的可读性和写入能力。


方案3:自定义可复用的Choice字段

如果项目中有大量choice字段需要返回展示值,可以封装通用的自定义字段复用:

class DisplayChoiceField(serializers.ChoiceField):
    def to_representation(self, value):
        if value in ('', None):
            return value
        return self.choices.get(value, value)

# 序列化器中使用自定义字段
class PetSerializer(serializers.ModelSerializer):
    gender = DisplayChoiceField(choices=Pet.GENDER)

    class Meta:
        model = Pet
        fields = "__all__"

内容的提问来源于stack exchange,提问作者Santhosh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:54:00