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
相关产品推荐
相关产品推荐

