【问题标题】:Add another argument to route for DRF为 DRF 的路由添加另一个参数
【发布时间】:2016-07-27 10:04:12
【问题描述】:

Django Rest Framework 默认生成一组 API 端点。比如这个:

^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

【问题讨论】:

  • 我认为重要的是序列化程序是视图。你能发表你的看法吗?

标签: django django-rest-framework


【解决方案1】:

我发现我在错误的地方使用了@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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-16
    • 2016-06-17
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多