Django Rest Framework序列化器label参数不生效问题求助
问题原因及解决方案
你的问题出在对DRF中label参数的作用理解有误:label仅用于表单渲染、API文档的友好显示(比如Browsable API里的表单标签),不会修改序列化输出的JSON键名。要实现自定义输出字段名,可采用以下两种方法:
方法一:重写to_representation方法(推荐)
通过重写序列化器的to_representation方法,直接自定义输出的键值映射:
class TotalMarksSerializer(serializers.Serializer): roll_number__roll_number = serializers.IntegerField() roll_number__first_name = serializers.CharField() roll_number__last_name = serializers.CharField() Total_Marks = serializers.FloatField() def to_representation(self, instance): # 获取默认序列化数据 original_data = super().to_representation(instance) # 重新映射为期望的键名 return { 'Roll Number': original_data['roll_number__roll_number'], 'First Name': original_data['roll_number__first_name'], 'Last Name': original_data['roll_number__last_name'], 'Total Marks': original_data['Total_Marks'] }
方法二:使用source参数配合键名转换
先给字段设置合法的Python标识符名称(不能含空格),通过source指向原数据字段,再在to_representation中转换为目标键名:
class TotalMarksSerializer(serializers.Serializer): roll_number = serializers.IntegerField(source='roll_number__roll_number') first_name = serializers.CharField(source='roll_number__first_name') last_name = serializers.CharField(source='roll_number__last_name') total_marks = serializers.FloatField(source='Total_Marks') def to_representation(self, instance): data = super().to_representation(instance) return { 'Roll Number': data['roll_number'], 'First Name': data['first_name'], 'Last Name': data['last_name'], 'Total Marks': data['total_marks'] }
验证效果
使用任一方法后,序列化输出会符合你的期望:
[ { "Roll Number": 1, "First Name": "Debbie", "Last Name": "Gutierrez", "Total Marks": 303.0 } ]
内容的提问来源于stack exchange,提问作者akshay patil
相关产品推荐
相关产品推荐

