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

问题描述

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

标签: pythondjangodjango-rest-frameworkdjango-views

解决方案


以下是 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)

现在,谈论create从覆盖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

希望能帮助到你 :)


推荐阅读