如何在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:新增专用序列化器(规范实现,适合逻辑复用场景)
如果后续你可能频繁调整这个接口的返回结构,或者需要在多个地方复用这个结构,可以新增一个专用的序列化器来处理格式转换:
- 修改
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]} ] }
- 修改
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
相关产品推荐
相关产品推荐

