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

标签 python django oop django-rest-framework mixins

我正在尝试覆盖 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_querysetself.get_serializerGenericAPIView 中定义的函数,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 会为您代劳。

关于python - 尝试覆盖 django rest 框架中的更新方法以在更新后返回整个查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49062058/

相关文章:

perl - 多重继承 - 选择了错误的重载

python - 如何在 Django 模型中编写方法来检索相关对象?

python - 蒸馏器导入错误 : No module named config

python - 将 Pandas 数据框转换为元组列表

django - 在 Django 中,在多对多关系中至少强制执行一个值?

java - 如何检查Map<String, Set<String>>中有多少个HashSet

python,import ssl 和 import _ssl 的区别

python - 未找到 Django Python 页面 (404)

python - 使用 Mechanize 和 Python Django View 解析 JSON 输出

PHP:我应该传入并返回这些变量吗?