在Django Rest框架中,APIView
类中的自定义方法的调用方式可能类似于.get()
或.post()
的调用方式。
我知道路由器使用@action()
或@link()
装饰器是有可能的,我想知道你是否可以做一些类似于APIView
的事情,但是拥有它,这样我就可以将方法设置为我想要的任何url。
我试过用@action()
和@api_view()
来修饰类,但似乎没有任何效果。
我不确定应该在url中放入什么,以便端点真正调用类中的方法。我会使用CartAPIView.clear.as_view()
、CartAPIView.clear
,还是CartAPIView.clear()
。我尝试过对CartAPIView
调用的不同组合,但都没有成功。
下面是我要做的一个例子:
# views.py
class CartAPIView(APIView):
@api_view(['POST'])
def clear(self, request):
"""Clear the users cart."""
queryset = Cart.objects.get(user=request.user)
queryset.clear_cart()
serializer = CartSerializer(queryset)
return Response(serializer.data, status=status.HTTP_200_OK)
# urls.py
urlpatterns = patterns('app.views',
....
url(r'^cart/clear/$', CartAPIView.clear.as_view(), name='clear_cart_api'),
....
)
任何帮助都将不胜感激。
您似乎忽略了基于类的视图流的工作原理。
as_view
通过创建未绑定函数来处理,并在该函数中实例化基于类的 查看。as_view
然后调用self.dispatch(request, *args, **kwargs)
,其中self
是刚刚创建的实例化对象。dispatch
调用self.get(request, *args, **kwargs)
或self.post(request, *args, **kwargs)
,这取决于请求方法(或者put
、patch
或delete
(如果允许并使用这些方法)。对于像
clear
函数这样的自定义函数没有空间,除非重写其中一个方法来调用self.clear(request)
。与@api_view(['POST'])
等价的是重写post(request, *args, **kwargs)
方法:似乎您要找的是Function Based Views,在这里您可以用
@api_view()
来装饰函数@knbk和@almalki在这里发布的两个答案都是我所问问题的有效途径。然而,他们并没有显示出我在调查了几个小时后实际上做了什么。
我最终使用的视图集允许我将
GET
、POST
等请求绑定到视图集类中的某个函数。通常你会使用路由器来自动绑定所有合适的函数,但我希望它们的绑定方式更灵活一些,所以我自己写出来。相关问题 更多 >
编程相关推荐