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

