在Django Rest Framework端点方法中使用@staticmethod?

时间:2018-04-24 03:09:44

标签: python django django-rest-framework

我应该将Django Rest Framework APIView的postget等方法定义为静态吗?

class HomeView(APIView):
    def get(request):
        etc...

class HomeView(APIView):
    @staticmethod
    def get(request):
        etc...

每种方式的优点/缺点是什么?

谢谢

3 个答案:

答案 0 :(得分:0)

作为DRF文档,您似乎不需要添加@staticmethod装饰器

答案 1 :(得分:0)

DRF不会将getpost声明为静态方法,您也不应该这样做。以下是DRF泛型中默认配置的方法。

在DRF中,从self.get_objectself.get_serializer中引用getpost等实例方法很常见。

class CreateAPIView(mixins.CreateModelMixin,
                    GenericAPIView):
    """
    Concrete view for creating a model instance.
    """
    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)


class ListAPIView(mixins.ListModelMixin,
                  GenericAPIView):
    """
    Concrete view for listing a queryset.
    """
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)


class RetrieveAPIView(mixins.RetrieveModelMixin,
                      GenericAPIView):
    """
    Concrete view for retrieving a model instance.
    """
    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)


class DestroyAPIView(mixins.DestroyModelMixin,
                     GenericAPIView):
    """
    Concrete view for deleting a model instance.
    """
    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)


class UpdateAPIView(mixins.UpdateModelMixin,
                    GenericAPIView):
    """
    Concrete view for updating a model instance.
    """
    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def patch(self, request, *args, **kwargs):
        return self.partial_update(request, *args, **kwargs)

答案 2 :(得分:0)

如果不通过'self',DRF将无法正常运行。

PyCharm确实将这些方法标记为“也许是静态的”,这是错误的!

将它们设为静态会中断方法的调用,因为调用者方法提供了“自我”,而您的方法则除外。本质上,您仍然可以将self别名作为请求,但是其他args将被忽略。这可能是无声发生的,这使得找到:(。

就性能而言,基于“静态”或基于常规函数的视图应该稍快一些,因为避免了实例的创建,但是这种差异可能很小,以至于很难引起注意。