如何覆盖 RetrieveAPIView 响应 django rest 框架

Posted

技术标签:

【中文标题】如何覆盖 RetrieveAPIView 响应 django rest 框架【英文标题】:how to overwrite RetrieveAPIView response django rest framework 【发布时间】:2017-09-23 20:51:24 【问题描述】:

我正在从 RetrieveAPIView 获取数据,我想覆盖它。

class PostDetailAPIView(RetrieveAPIView):
    queryset = Post.objects.all()
    serializer_class = PostDetailSerializer
    lookup_field = 'slug'

http://127.0.0.1:8000/api/posts/post-python/

返回结果


    "id": 2,
    "title": "python",
    "slug": "post-python",
    "content": "content of python"

我想用一些额外的参数来覆盖它

[ 
   'result':
   
    "id": 2,
    "title": "python",
    "slug": "post-python",
    "content": "content of python"
    ,
   'message':'success'
]

【问题讨论】:

你想改变你的 PostDetailSerializer 序列化数据的方式,而不是你的 View 如何返回它们。此外,您已经发布了您的“本地 url”,127.0.0.1 是您在本地网络中的机器,不是我们可以从其他地方看到或访问的东西。 它只是一个简单的 RetrieveAPIView,我没有实现任何逻辑。 youtube.com/watch?v=_GXGcc7XxvQ。我从这里学习并实现了相同的,但他没有分享如何重写它。 How to return custom JSON in Django REST Framework的可能重复 【参考方案1】:

好的,在评论中我打错了电话,你想覆盖你的 View 的 get() 方法。

class PostDetailAPIView(RetrieveAPIView):
    queryset = Post.objects.all()
    serializer_class = PostDetailSerializer
    lookup_field = 'slug'

    def get(self, request, slug):
        post = self.get_object(slug)
        serializer = PostDetailSerializer(post)
        return Response(
            'result': serializer.data,
            'message': 'success'
        )

注意事项 1.我将get函数的第二个参数命名为slug,因为它是你的lookup_field,但它应该是你在url中使用的名称。 2. 你可以改写retrieve() 函数 3.这是针对您的问题的特定答案,您还应该阅读this answer

【讨论】:

以上是关于如何覆盖 RetrieveAPIView 响应 django rest 框架的主要内容,如果未能解决你的问题,请参考以下文章

Django REST 框架 RetrieveAPIView 获取空的“id”参数并返回 404 错误

在Django Rest Framework中覆盖JSON数据

如何覆盖 Spring Boot 健康响应代码

如何使覆盖元素响应?

如何覆盖 django rest 框架( DRF )中的响应类?

如何在 Spring Boot 中覆盖默认 JSON 响应