Skip to main content
 首页 » 编程设计

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

2025年01月19日25myhome

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

从头开始。

我正在使用 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_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.updatereturnall 方法时不需要显式传递self 参数,Python 会为您代劳。