尝试覆盖django rest框架中的update方法,以在更新后返回整个查询集
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尝试覆盖django rest框架中的update方法,以在更新后返回整个查询集相关的知识,希望对你有一定的参考价值。
我试图在django rest框架中覆盖put请求的update方法。而不是只返回更新的对象。我希望它返回整个查询集,包括更新的对象。对于我正在使用的用例,它更容易。
从顶部开始。
我正在使用Django Rest Frameworks Generics。
class SearchCityDetail(RetrieveUpdateDestroyAPIView):
queryset = SearchCity.objects.all()
serializer_class = SearchCitySerializer
我重写了我的自定义mixin中的类PUT
方法和固有方法。
class SearchCityDetail(RetrieveUpdateDestroyAPIView, UpdateReturnAll):
queryset = SearchCity.objects.all()
serializer_class = SearchCitySerializer
def put(self, request, *args, **kwargs):
return self.updatereturnall(self,request, *args, **kwargs)
自定义mixin看起来像这样(我的自定义添加代码与普通更新代码不同,它上面有#Custom代码:
from rest_framework import status
from rest_framework.response import Response
from rest_framework.settings import api_settings
from rest_framework.mixins import UpdateModelMixin
"""
Update a model instance and return all.
"""
#Custom Code
class UpdateReturnAll(UpdateModelMixin):
#custom name normally just update
def updatereturnall(self, request, model, *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)
if getattr(instance, '_prefetched_objects_cache', None):
# If 'prefetch_related' has been applied to a queryset, we need to
# forcibly invalidate the prefetch cache on the instance.
instance._prefetched_objects_cache = {}
#all objects and all serializer is custom code
allobjects = self.get_queryset(self)
allserializer = self.get_serializer(allobjects, many=True)
return Response(allserializer.data)
def perform_update(self, serializer):
serializer.save()
def partial_update(self, request, *args, **kwargs):
kwargs['partial'] = True
return self.update(request, *args, **kwargs)
self.get_queryset
和self.get_serializer
是在GenericAPIView
中定义的函数,RetrieveUpdateDestroyAPIView
来自。由于我将UpdateReturnAll
继承到SearchCityDetail
类,因此UpdateReturnALL可以使用两种方法
这是我的理解。
我目前收到错误和状态代码500
错误是:AttributeError: 'SearchCityDetail' object has no attribute 'data'
我究竟做错了什么?
它应该是:
class SearchCityDetail(RetrieveUpdateDestroyAPIView, UpdateReturnAll):
queryset = SearchCity.objects.all()
serializer_class = SearchCitySerializer
def put(self, request, *args, **kwargs):
return self.updatereturnall(request, *args, **kwargs)
而不是return self.updatereturnall(self,request, *args, **kwargs)
。
调用self
方法时,不需要传递self.updatereturnall
参数,Python会为你做。
以上是关于尝试覆盖django rest框架中的update方法,以在更新后返回整个查询集的主要内容,如果未能解决你的问题,请参考以下文章
django rest框架中的save()、create()和update()有啥区别?
如何覆盖 RetrieveAPIView 响应 django rest 框架
如何在 django rest 框架 ModelSerializer 中覆盖模型字段验证