2016-07-27 5 views
0

Есть набор конечных точек API, сгенерированных по умолчанию Django Rest Framework. Пример этого:Добавить еще один аргумент для маршрута для 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

Я думаю, что важнее, чем сериализатор - это Представления. Можете ли вы опубликовать свои мнения? – 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) 
Смежные вопросы