You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从枚举返回标准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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 02:27:43