尝试覆盖django rest框架中的update方法,以在更新后返回整个查询集

问题描述 投票:2回答:1

我试图在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_querysetself.get_serializer是在GenericAPIView中定义的函数,RetrieveUpdateDestroyAPIView来自。由于我将UpdateReturnAll继承到SearchCityDetail类,因此UpdateReturnALL可以使用两种方法

这是我的理解。

我目前收到错误和状态代码500

错误是:AttributeError: 'SearchCityDetail' object has no attribute 'data'

我究竟做错了什么?

python django oop django-rest-framework mixins
1个回答
1
投票

它应该是:

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会为你做。

© www.soinside.com 2019 - 2024. All rights reserved.