如何在 django-rest-framework 中覆盖通用视图(例如:ListCreateAPIView)中的 .create() 方法?

Sha*_*wat 3 python django django-views django-rest-framework

我想重写基于类的视图的创建方法,它实现了ListCreateAPIView,一般不会同时覆盖类的方法get_queryset(self)方法的要求,该URL**kwargs是从访问self,但我想重写.create()的方法CreateModelMixin,所以我在拍了一下查找签名的代码作为create(self, request, *args, **kwargs)django 在**kwargs, *args这个函数中传递了什么?这些网址**kwargs是偶然的吗?我如何覆盖通用视图中的 create 方法,因为通用视图request的任何函数都是从 访问的,self但是创建函数的签名显式需要一个请求参数。

mre*_*han 7

以下是 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)
Run Code Online (Sandbox Code Playgroud)

现在,谈论覆盖createfrom CreateModelMixin,您可以简单地将其覆盖为:

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
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 :)