如何在Django REST Framework的ModelViewSet中扩展响应内容?
解决DRF中ModelViewSet返回自定义字段与原有数据合并的问题
嘿,我明白你的需求啦!你现在的问题是在create方法里只返回了自定义的消息和状态码,但想把模型的原有数据也一起返回对吧?其实很简单,只需要把序列化后的模型数据和自定义字段合并起来就行,下面是具体的修改方案:
修改后的create方法代码
class BookViewSet(viewsets.ModelViewSet): permission_classes = [AllowAny] queryset = Book.objects.all() serializer_class = BookSerializer def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) # 合并序列化数据与自定义字段 response_data = serializer.data.copy() response_data["message"] = "You have successfully create a book" response_data["status"] = "200" return Response(response_data, headers=headers)
原理说明
serializer.data已经包含了创建成功后的模型数据(也就是你之前提到的id、book、author这些字段)- 我们先复制一份
serializer.data的字典(避免直接修改原数据),然后把自定义的message和status字段添加进去,最后返回这个合并后的字典即可。
更简洁的写法(可选)
你也可以用字典解包的方式快速合并,代码更简洁:
return Response( {**serializer.data, "message": "You have successfully create a book", "status": "200"}, headers=headers )
如果需要修改update方法的话
如果你希望update方法也返回类似的结构,修改逻辑是完全一样的,只需要在update方法里做同样的合并操作:
def update(self, request, *args, **kwargs): partial = kwargs.pop('partial', False) instance = self.get_object() serializer = self.get_serializer(instance, data=request.data, partial=partial) serializer.is_valid(raise_exception=True) self.perform_update(serializer) # 合并数据 response_data = serializer.data.copy() response_data["message"] = "You have successfully update a book" response_data["status"] = "200" return Response(response_data)
这样就能得到你预期的包含原有模型数据和自定义字段的响应啦!
内容的提问来源于stack exchange,提问作者Jin Nii Sama
相关产品推荐
相关产品推荐

