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

如何在Django Rest Framework中创建自定义API视图返回指定响应结构

问题解答

是否需要新建模型?

完全不需要,你可以直接基于现有Practice模型的字段数据构造目标响应结构,不需要新增任何数据库表或者模型定义。

实现步骤

方式1:直接在视图层构造响应(快速实现,适合轻量场景)

直接新增一个API视图,查询到Practice实例后手动拼接你需要的返回结构即可,修改views.py新增如下代码:

@api_view(['GET'])
def practice_chart_data(request, pk):
    try: 
        practice = Practice.objects.get(pk=pk) 
    except Practice.DoesNotExist: 
        return JsonResponse({'message': 'The practice does not exist'}, status=status.HTTP_404_NOT_FOUND) 

    if request.method == 'GET': 
        res = {
            "labels": ["Practice"],
            "datasets": [
                {"label": "Correct", "data": [practice.correct]},
                {"label": "Wrong", "data": [practice.wrong]},
                {"label": "Not_answered", "data": [practice.not_answered]}
            ]
        }
        return JsonResponse(res)

之后在你的路由配置文件(通常是urls.py)中新增对应接口路由:

# 示例路由,可根据你的实际路由规则调整
path('api/practice/<int:pk>/chart/', practice_chart_data, name='practice_chart')

配置完成后访问/api/practice/485/chart/即可得到你需要的响应结构。

方式2:新增专用序列化器(规范实现,适合逻辑复用场景)

如果后续你可能频繁调整这个接口的返回结构,或者需要在多个地方复用这个结构,可以新增一个专用的序列化器来处理格式转换:

  1. 修改serializers.py新增序列化器:
class PracticeChartSerializer(serializers.Serializer):
    # 重写序列化转换方法,直接把Practice实例转为目标结构
    def to_representation(self, instance):
        return {
            "labels": ["Practice"],
            "datasets": [
                {"label": "Correct", "data": [instance.correct]},
                {"label": "Wrong", "data": [instance.wrong]},
                {"label": "Not_answered", "data": [instance.not_answered]}
            ]
        }
  1. 修改views.py新增对应视图:
@api_view(['GET'])
def practice_chart_data(request, pk):
    try: 
        practice = Practice.objects.get(pk=pk) 
    except Practice.DoesNotExist: 
        return JsonResponse({'message': 'The practice does not exist'}, status=status.HTTP_404_NOT_FOUND) 

    if request.method == 'GET': 
        serializer = PracticeChartSerializer(practice)
        return JsonResponse(serializer.data)

路由配置和方式1完全一致即可。

内容的提问来源于stack exchange,提问作者Aras121

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:48:02