我应该将Django Rest Framework APIView的post
,get
等方法定义为静态吗?
class HomeView(APIView):
def get(request):
etc...
或
class HomeView(APIView):
@staticmethod
def get(request):
etc...
每种方式的优点/缺点是什么?
谢谢
答案 0 :(得分:0)
作为DRF文档,您似乎不需要添加@staticmethod装饰器
答案 1 :(得分:0)
DRF不会将get
和post
声明为静态方法,您也不应该这样做。以下是DRF泛型中默认配置的方法。
在DRF中,从self.get_object
和self.get_serializer
中引用get
和post
等实例方法很常见。
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将被忽略。这可能是无声发生的,这使得找到:(。
就性能而言,基于“静态”或基于常规函数的视图应该稍快一些,因为避免了实例的创建,但是这种差异可能很小,以至于很难引起注意。