【问题标题】:Django rest framework: query parameters in detail_routeDjango rest框架:在detail_route中查询参数
【发布时间】:2016-02-27 19:40:57
【问题描述】:

我有以下 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}”的 url。 也许答案是使用 lookup_fieldlookup_url_kwarg 但我在 detail_route 案例中找不到它们的用法。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:
    1. 对于端点 url 为:(使用 Django REST ViewSets)

    {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. 对于端点 URL 作为

      {mysite}/users/{pk}/password/{number}

    将上述密码方式改为

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

    【讨论】:

    • 我不确定第一个示例如何适合 url。有id 被访问/提供/定义?
    • @NirIzr 这些detail_route 已被弃用。 link
    【解决方案2】:

    您可以在detail_route 中添加url_path,例如:

    @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})
    

    【讨论】:

    • 谢谢。 “chapter_id”怎么可能是可选的?
    • @Beheshti 您可以添加另一个 detail_route,例如:@detail_route(url_path='chapter') 或者您可以只使用一个 detail_route,例如:@detail_route(url_path='chapter') 并在 URL 中传递 chapter_id,例如:/book/{id}/chapter?chapter_id=123跨度>
    • 使用第一个解决方案我得到了这个错误:“chapter() got an unexpected keyword argument 'chapter_id'”!
    • @Beheshti 对函数使用不同的名称,例如:def chapter_list(self, request, pk=None)def chapter_detail(self, request, pk=None, chapter_id=None)
    • 这似乎用 DefaultRouter 打破了 url 名称
    猜你喜欢
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 2017-09-24
    • 2019-12-24
    • 1970-01-01
    相关资源
    最近更新 更多