gpt4 book ai didi

python - 可以在从 url 调用的 APIView 上有一个方法

转载 作者:太空狗 更新时间:2023-10-29 21:19:55 29 4
gpt4 key购买 nike

在 Django Rest Framework 中,是否可以在 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'),
....
)

如有任何帮助,我们将不胜感激。

最佳答案

您似乎忽略了基于类的 View 的流程如何工作的要点。

  • 因为基于类的 View 是一个类(很明显),而 Django 期望一个未绑定(bind)函数(未附加到类或实例)作为 View ,as_view 通过创建未绑定(bind)函数来处理它,并在该函数中实例化基于类的看法。
  • as_view 然后调用self.dispatch(request, *args, **kwargs),其中self 是刚刚创建的实例化对象.
  • dispatch 调用 self.get(request, *args, **kwargs)self.post(request, *args, **kwargs) ,取决于请求方法(或 putpatchdelete,如果允许和使用的话)。

clear 函数这样的自定义函数没有空间,除非您覆盖这些方法之一来调用self.clear(request)@api_view(['POST']) 的等价物是覆盖 post(request, *args, **kwargs) 方法:

# views.py
class CartAPIView(APIView):
def post(self, request, *args, **kwargs):
# Why would you call this 'queryset'? It's a single object.
cart = Cart.objects.get(user=request.user)
cart.clear_cart()

serializer = CartSerializer(cart)
return Response(serializer.data, status=status.HTTP_200_OK)

# urls.py
urlpatterns = patterns('app.views',
url(r'^cart/clear/$', CartAPIView.as_view(), name='clear_cart_api'),
)

关于python - 可以在从 url 调用的 APIView 上有一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22547591/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com