代码之家  ›  专栏  ›  技术社区  ›  crawlingdev

Django Rest Framework-当函数根本不应该做任何事情时,为什么我会出错

  •  0
  • crawlingdev  · 技术社区  · 3 年前

    具有以下URL:

    path("products/product/<int:product>/rating/", ProductRating.as_view()),
    

    以及此视图来处理URL:

    class ProductRating(APIView):
        permission_classes = [permissions.IsAuthenticated]
        serializer_class = ProductRatingSerializer
    
        def get(self, request):
            breakpoint()
    

    在URL中,int:product中的product只是有问题的产品的id。无论我在那里放了什么,无论是int:pk还是int:id,我每次都会得到相同的错误:

    TypeError: get() got an unexpected keyword argument 'product'
    

    我尝试过使用通用视图RetrieveAPIView和一个APIView,但我得到了相同的错误。为什么我得到一个错误而不是断点?

    2 回复  |  直到 3 年前
        1
  •  0
  •   Ayman    3 年前
    def get(request, request, product):
            breakpoint()
    

    现在应该可以工作了!

        2
  •  0
  •   kalkidan Teklu    3 年前

    每当您处理一个url时,该url的路径中有一个查询参数(id,pk,slug…),它将作为kwarg传递给view函数。因此,您必须定义捕获该参数的显式参数,或者您可以在函数中定义一个**kwargs参数。

    实施:

    def get(self, request, product):
        ....
    
    

    或

    def get(self, request, **kwargs):
        product = kwargs.get("product")
        ...
    
    
        3
  •  0
  •   Maz    3 年前

    通过解释改进:

    首先调整你的网址如下:

    path("products/rating/<int:product>",ProductRating.as_view()),
    

    这是为了避免与其他url发生任何可能的冲突,将关键字放在最后。另外,在get函数中添加*args和**kwargs,将send关键字传递给该函数。从提取产品时的错误来看,这似乎可以解决您的问题。

    下面我即兴制作了get函数,这样你就可以通过使用self.kwargs为基于类的视图提取url参数,还可以返回JsonResponse,以完成返回响应的函数。

    from django.http import JsonResponse
    
    class ProductRating(APIView):
       permission_classes = [permissions.IsAuthenticated]
       serializer_class = ProductRatingSerializer 
    
       def get(self, request, *args, **kwargs):
          product_id = self.kwargs["product"]
          breakpoint()
          return JsonResponse(data={"status": "200, Yay it works"})