如何在Django REST Framework中自动展示Choice字段的显示值而非键?
自动展示DRF中所有Choice字段的显示值
不需要为每个Choice字段手动配置source="get_xxx_display",有两种高效方式实现自动处理:
方法一:重写ModelSerializer的get_fields方法
通过重写序列化器的get_fields方法,自动识别模型中带choices参数的字段,替换为返回显示值的CharField:
from rest_framework import serializers class ChoiceDisplayModelSerializer(serializers.ModelSerializer): def get_fields(self): fields = super().get_fields() for field_name, field in fields.items(): # 获取模型对应的字段对象 model_field = self.Meta.model._meta.get_field(field_name) # 检查字段是否配置了choices if model_field.choices: # 替换为返回display值的字段 fields[field_name] = serializers.CharField( source=f"get_{field_name}_display", read_only=True ) return fields # 业务序列化器直接继承这个自定义类 class JoueurSerializer(ChoiceDisplayModelSerializer): class Meta: model = Player fields = "__all__"
这个方法会自动遍历模型所有字段,只要是配置了choices的字段,都会自动返回对应的文本显示值,无需逐个手动配置。
方法二:自定义双向Choice字段类
如果需要同时支持返回显示值和接收显示值转换为存储键的双向场景,可以自定义字段类:
from rest_framework import serializers class ChoiceDisplayField(serializers.Field): def __init__(self, model_field, **kwargs): self.model_field = model_field super().__init__(**kwargs) def to_representation(self, value): # 序列化时返回显示文本 return self.model_field.choices.get(value, value) def to_internal_value(self, data): # 反序列化时将显示文本转换为数据库存储的键 for key, display in self.model_field.choices: if display == data: return key raise serializers.ValidationError(f"无效选项: {data}") # 在序列化器中自动替换Choice字段 class ChoiceDisplayModelSerializer(serializers.ModelSerializer): def get_fields(self): fields = super().get_fields() for field_name, field in fields.items(): model_field = self.Meta.model._meta.get_field(field_name) if model_field.choices: fields[field_name] = ChoiceDisplayField(model_field=model_field) return fields
这种方式既满足列表视图返回显示值的需求,也支持前端传入显示文本时自动转换为数据库存储的键,适配更多业务场景。
内容的提问来源于stack exchange,提问作者pacdev
相关产品推荐
相关产品推荐

