2016-07-27 66 views
0

有一組由Django Rest Framework默認生成的API端點。示例這一個:爲DRF添加另一個路由參數

^api/^^provinces/(?P<pk>[^/.]+)/$ [name='province-detail'] 

產生http://127.0.0.1:8000/api/provinces/02/這很好。 它使用的實際代碼波紋管:

class ProvinceSerializer(serializers.ModelSerializer): 
    """ Serializer to represent the Province model """ 
    class Meta: 
     model = Province 
     fields = ("name", "code") 

我要增加另一個路線,這樣我可以有例如另一個端點:

^api/^^provinces/(?P<pk>[^/.]+)/(?P<product>[^/.]+)/$ [name='province-product-detail'] 

所以,我可以這樣做http://127.0.0.1:8000/api/provinces/02/apple/和訪問串行器方法中的第二個參數。我試圖這樣做:

class ProvinceSerializer(serializers.ModelSerializer): 
    """ Serializer to represent the Province model """ 
    class Meta: 
     model = Province 
     fields = ("name", "code") 

    @detail_route(methods=['post']) 
    def set_product(self, request, product=None): 
     return product 
+0

我認爲礦石重要,那麼序列化程序就是Views。你可以發表你的意見嗎? – jarussi

回答

0

我發現我在錯誤的地方使用@detail_route。我們只需要這樣做:

class ProvinceDistrictViewSet(viewsets.ModelViewSet): 
    """ 
    API endpoint that allows users to view or edit province. 
    """ 
    queryset = Province.objects.all() 
    serializer_class = ProvinceDistrictsSerializer 

    # For get provinces 
    @detail_route(methods=['get'], url_path='(?P<product>\d+)') 
    def update_product(self, request, pk, product=None): 
     """ Updates the object identified by the pk and add the product """ 
     queryset = Province.objects.filter(pk=pk) 
     serializer = ProvinceDistrictsSerializer(queryset, many=True, context={'product': product}) 
     return Response(serializer.data, status=status.HTTP_200_OK)