Django rest框架:在detail_route中查询参数

时间:2015-11-25 05:51:41

标签: django django-rest-framework

我有以下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情况下找到它们。

2 个答案:

答案 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)

  1. 对于端点网址:(使用Django REST ViewSets)
  2.   

    {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。

    1. 对于EndPoint Url as
        

      {mysite的} /用户/ {PK} /口令/ {数}

    2. 将上述密码方法更改为

      @detail_route(url_path='password/(?P<number>[0-9]+)')
      def password(self, request,pk=None, number=None):
          return HttpResponse("Wow! It Again Works")