发送请求到detail_route [DRF]

时间:2017-10-21 15:49:49

标签: django django-rest-framework

我一直在使用视图集中的detail_route上的POST方法,我不知道该怎么做。我有这个观点:

class ListViewSet(viewsets.ModelViewSet):
    queryset = models.List.objects.all()
    serializer_class = serializers.ListSerializer

    @detail_route(methods=['get'])
    def entries(self, request, pk=None):
        list = self.get_object()
        serializer = serializers.EntrySerializer(
            list.entries.all(), many=True
        )

        return Response(serializer.data)


class EntryViewSet(viewsets.ModelViewSet):
    queryset = models.Entry.objects.all()
    serializer_class = serializers.EntrySerializer

如您所见,我确实在get上实现了detail_route方法,但我不知道实现post方法将条目附加到该特定列表的最佳方法(如detail_route的ListCreateAPIView)。

我有EntryViewSetapi/v1/entries,但我希望能够发送一个POST请求,将一个条目附加到特定列表,这就是为什么我想要发送请求{ {1}}。

我不希望用户偷偷摸摸并尝试将条目发送到其他列表。

以下是模型:

detail_route

提前感谢您的答案!

1 个答案:

答案 0 :(得分:0)

如果您查看 SimpleRouter 的源代码,其实很简单。

然后您可以将其子类化并创建您自己的路由器,向其添加一行以映射帖子详细信息路由,在我的示例中,我将其映射到名为 detail_post

的方法
class DetailPostSimpleRouter(SimpleRouter):
    routes = [
        # List route.
        Route(
            url=r'^{prefix}{trailing_slash}$',
            mapping={
                'get': 'list',
                'post': 'create'
            },
            name='{basename}-list',
            detail=False,
            initkwargs={'suffix': 'List'}
        ),
        # Dynamically generated list routes. Generated using
        # @action(detail=False) decorator on methods of the viewset.
        DynamicRoute(
            url=r'^{prefix}/{url_path}{trailing_slash}$',
            name='{basename}-{url_name}',
            detail=False,
            initkwargs={}
        ),
        # Detail route.
        Route(
            url=r'^{prefix}/{lookup}{trailing_slash}$',
            mapping={
                'get': 'retrieve',
                'put': 'update',
                'patch': 'partial_update',
                'delete': 'destroy',
                'post': 'detail_post' ### here's the magic ###
            },
            name='{basename}-detail',
            detail=True,
            initkwargs={'suffix': 'Instance'}
        ),
        # Dynamically generated detail routes. Generated using
        # @action(detail=True) decorator on methods of the viewset.
        DynamicRoute(
            url=r'^{prefix}/{lookup}/{url_path}{trailing_slash}$',
            name='{basename}-{url_name}',
            detail=True,
            initkwargs={}
        ),
    ]

在您的视图集中,创建一个名为 detail_post 的方法。

class ListViewSet(viewsets.ModelViewSet):
    queryset = models.List.objects.all()
    serializer_class = serializers.ListSerializer

    def detail_post(self, request, pk=None):
        # your view logic

然后在您的 urls.py 中,使用我们自己的 DetailPostSimpleRouter 而不是 SimpleRouter

这只是关于如何做,是否应该做是另一个要讨论的话题。

资源: https://github.com/encode/django-rest-framework/blob/master/rest_framework/routers.py