我一直在使用视图集中的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)。
我有EntryViewSet
即api/v1/entries
,但我希望能够发送一个POST请求,将一个条目附加到特定列表,这就是为什么我想要发送请求{ {1}}。
我不希望用户偷偷摸摸并尝试将条目发送到其他列表。
以下是模型:
detail_route
提前感谢您的答案!
答案 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