【问题标题】:how to override the .create() method inside a generic view (example: ListCreateAPIView) in django-rest-framework?如何在 django-rest-framework 的通用视图(例如:ListCreateAPIView)中覆盖 .create() 方法?
【发布时间】:2018-12-07 21:50:15
【问题描述】:

我想在实现 ListCreateAPIView 的基于类的视图中覆盖 create 方法,而不是在覆盖 get_queryset(self) 方法、请求、url **kwargs 等方法时从 self 访问,但是我想重写CreateModelMixin.create()方法,所以我看了一下代码找到签名为create(self, request, *args, **kwargs) django在这个函数的**kwargs, *args中传递了什么?这些网址是**kwargs吗?如何覆盖通用视图中的 create 方法,因为通用视图的任何函数中的 request 都是从 self 访问的,但 create 函数的签名明确需要请求参数。

【问题讨论】:

    标签: python django django-rest-framework django-views


    【解决方案1】:
    from rest_framework import generics
    
    from tasks.models import Task
    from tasks.serializers import TaskSerializer
    
    
    class TaskList(generics.ListCreateAPIView):
        queryset = Task.objects.all()
        serializer_class = TaskSerializer
    
        def create(self, request, *args,**kwargs):
            # your implementation
            return Response(response)
    

    【讨论】:

      【解决方案2】:

      下面是DRF ListCreateAPIView,你可以看到*args, **kwargs是直接从标准post方法传下来的:

      class ListCreateAPIView(mixins.ListModelMixin,
                          mixins.CreateModelMixin,
                          GenericAPIView):
          """
          Concrete view for listing a queryset or creating a model instance.
          """
          def get(self, request, *args, **kwargs):
              return self.list(request, *args, **kwargs)
      
          def post(self, request, *args, **kwargs):
              return self.create(request, *args, **kwargs)
      

      现在,谈到从CreateModelMixin 覆盖create,您可以简单地将其覆盖为:

      from rest_framework import generics
      
      class YourWonderfulView(generics.ListCreateAPIView):
      
          queryset = YourModelClass.objects.all()
          serializer_class = YourSerializer
      
          def create(self, request, *args, **kwargs): # don't need to `self.request` since `request` is available as a parameter.
      
              # your custom implementation goes here
      
              return Response(response) # `response` is your custom response – e.g. dict, list, list of dicts etc
      

      希望对你有帮助:)

      【讨论】:

      • 即使我不需要使用 'self.request' ,我仍然可以在 create() 函数中使用它,对吗?因为 self 是一个 YourWonderFulView 对象,因此我想应该具有请求之类的属性。
      • 是的,您应该使用参数中的request。如果这回答了您的问题,请接受此作为答案,或者如果有任何不清楚的地方请告诉我,很乐意为您提供帮助!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      相关资源
      最近更新 更多