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

DRF中Choices字段序列化获取choices元组第二个值的方法

Django DRF 序列化嵌套IntegerChoices字段的正确配置

首先修正你代码里的基础语法错误:序列化器类定义关键字是小写class,你写的大写Class会直接抛语法错误。

关于choices引用和序列化逻辑,分场景按以下方式配置即可:

  • 引用模型内部嵌套的IntegerChoices类生成的choices不需要做任何格式转换,BookModel.BookRating.choices本身就是DRF ChoiceField支持的标准二元元组结构,直接传参路径完全合法。

方案1:默认返回枚举整数值(最简配置)

不需要手动重写rating字段,ModelSerializer会自动读取模型字段的choices、null、blank配置,自动生成符合规则的ChoiceField:

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = BookModel
        fields = '__all__'

该配置效果:

  • 反序列化时自动校验入参必须在枚举可选范围内,支持传入None
  • 序列化输出时返回枚举对应的整数值(0-5)

方案2:序列化返回可读文本标签

如果需要接口直接返回Awful/Bad这类可读标签而非数字,手动声明字段时补全空值配置,重写序列化输出逻辑即可:

class BookSerializer(serializers.ModelSerializer):
    rating = serializers.ChoiceField(
        choices=BookModel.BookRating.choices,
        allow_null=True,
        required=False
    )

    def to_representation(self, instance):
        data = super().to_representation(instance)
        if data['rating'] is not None:
            data['rating'] = BookModel.BookRating(data['rating']).label
        return data

    class Meta:
        model = BookModel
        fields = '__all__'

方案3:同时返回枚举值和可读标签(推荐前端交互场景使用)

不需要重写ChoiceField,直接利用Django模型为choices字段自动生成的get_<字段名>_display方法,额外加一个只读字段返回标签即可:

class BookSerializer(serializers.ModelSerializer):
    rating_label = serializers.CharField(source='get_rating_display', read_only=True)
    class Meta:
        model = BookModel
        fields = '__all__'

该配置下序列化输出会同时包含两个字段:

  • rating:枚举整数值,用于前端传参、逻辑判断
  • rating_label:可读文本标签,用于前端直接展示

内容的提问来源于stack exchange,提问作者John Jethro Rashbold

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:51:20