我有以下ViewSet:
class BookViewSet(DefaultsMixin, viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
@detail_route()
def chapter(self, request,pk=None):
queryset = Chapter.objects.filter(book__pk=pk)
serializer = ChpaterSerializer(queryset,
context={'request':request},
many=True)
return Response(serializer.data)
所以网址“/ book / {id} / chapter”有效。 但我不知道如何配置ViewSet以获得类似“/ book / {id} / chapter / {id}”的网址。 也许答案是使用 lookup_field 或 lookup_url_kwarg ,但我无法在detail_route情况下找到它们。
答案 0 :(得分:30)
您可以在url_path
中添加detail_route
,例如:
@detail_route(url_name='chapter', url_path='chapter/(?P<chapter_id>[0-9]+)')
def chapter(self, request, pk=None, chapter_id=None):
queryset = Chapter.objects.filter(book__pk=pk)
serializer = ChpaterSerializer(queryset,
context={'request':request},
many=True)
return Response(serializer.data)
请注意,默认路由器中的url名称默认为url_path
参数(如果已提供)。因此视图名称将包含查询参数字符串。通过指定url_name
参数,您可以简化它。我建议在那里使用方法名称,如果未指定url_path
,则默认为默认值。有了它,您可以使用
reverse('book-chapter', kwargs={'pk': 1, 'chapter_id': 4})
答案 1 :(得分:1)
{mysite} / users / {pk} / password / {id}
为了在我的视图中工作,我做了:
class UsersViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
@detail_route(url_path='password')
def password(self, request,pk=None):
return HttpResponse("Wow! It Works")
从上面你可以通过pk变量从url中检索id。
{mysite的} /用户/ {PK} /口令/ {数}
将上述密码方法更改为
@detail_route(url_path='password/(?P<number>[0-9]+)')
def password(self, request,pk=None, number=None):
return HttpResponse("Wow! It Again Works")