如何从枚举返回标准Django Rest Framework JSON格式数据?
解决DRF序列化枚举类生成指定格式响应的问题
问题分析
你之前的代码存在几个关键错误:
- 第一个序列化器错误使用了
Meta类和model属性,SomeValuesEnum不是Django模型,普通Serializer不需要这些配置。 - 视图中生成数据时,
name字段应该取枚举的name属性(如ONE_VALUE),而非target.value.capitalize(),这会导致name值不符合需求。 - 初始化序列化器时误用了
data=choices,这是反序列化(将数据转为对象)的用法,序列化应传入instance参数,且处理多个数据时需添加many=True。
正确实现代码
1. 定义序列化器
直接声明需要输出的字段即可,无需关联模型:
from rest_framework import serializers class SomeValueSerializer(serializers.Serializer): name = serializers.CharField() value = serializers.CharField()
2. 编写视图类
正确遍历枚举生成数据,序列化后构造指定格式的响应:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .your_enum_module import SomeValuesEnum # 替换为枚举类的实际导入路径 class SomeValueListView(APIView): def get(self, request): # 转换枚举为符合序列化要求的字典列表 enum_items = [ {"name": item.name, "value": item.value} for item in SomeValuesEnum ] # 序列化数据:instance传入要序列化的列表,many=True表示处理多个对象 serializer = SomeValueSerializer(instance=enum_items, many=True) # 构造要求的响应结构 response = { "count": len(enum_items), "page_count": 1, "next": None, "previous": None, "results": serializer.data } return Response(response, status=status.HTTP_200_OK)
关键说明
- 序列化器仅需声明需要返回的字段,因为我们不是序列化Django模型实例。
- 使用
instance参数传递待序列化的数据,many=True告知序列化器处理的是列表而非单个对象。 - 手动构造分页相关字段(
count、page_count等),若后续需要支持分页,可接入DRF的分页器组件。
内容的提问来源于stack exchange,提问作者Nisanio
相关产品推荐
相关产品推荐

