【问题标题】:Attempting to override update method in django rest framework to return entire queryset after update尝试覆盖 django rest 框架中的更新方法以在更新后返回整个查询集
【发布时间】:2018-03-02 02:49:29
【问题描述】:

我正在尝试覆盖 django rest 框架中 put 请求的更新方法。而不是只返回更新的对象。我希望它返回整个查询集,包括更新的对象。对于我正在处理的用例,它更容易。

从顶部开始。

我正在使用 Django Rest Frameworks 泛型。

class SearchCityDetail(RetrieveUpdateDestroyAPIView):
    queryset = SearchCity.objects.all()
    serializer_class = SearchCitySerializer

我重写了类PUT 方法和我的自定义mixin 固有的方法。

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 Code:

    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】:

    应该是:

    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.updatereturnall方法时不需要显式传递self参数,Python为你做。

    【讨论】:

    • 干得好,非常感谢。为什么python会为我们做这件事?是什么原因?
    • @amazingcarrotsoup 欢迎您!好吧,在 Python 中有绑定和未绑定的方法。代码中的方法绑定到特定实例,因此您不能将任何其他实例作为 self 参数传递。检查此问题以获取详细信息stackoverflow.com/questions/114214/…
    • 它是否也适用于 PATCH 请求?
    猜你喜欢
    • 2020-06-14
    • 2020-05-30
    • 2018-06-18
    • 2020-04-20
    • 2015-12-25
    • 2011-08-17
    • 2016-08-09
    • 1970-01-01
    • 2021-04-30
    相关资源
    最近更新 更多