【问题标题】:ViewSet and Router in rest frameworkREST框架中的ViewSet和Router
【发布时间】:2017-12-23 21:30:50
【问题描述】:

rest 框架有问题: 使用视图集和路由器构建 api。

我希望 api 像这样通过 url 序列化用户的帖子: /api/users/用户 ID/posts/页面, 但是路由器受不了。 它建议我使用模式中的正则表达式:

^api/ ^ ^users/posts\.(?P<format>[a-z0-9]+)/?$ [name='user-posts']

class UserViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

     @list_route()
     def posts(self, page):
         user = self.get_object()
         post_set = Post.objects.filter(owner=user)
         paginator = Paginator(post_set, 16)
         serializer = PostSerializer(paginator.page(page), many=True)
         return Response(serializer.data)

对如何正确执行这项工作有任何想法吗?提前致谢!

【问题讨论】:

  • 您的网址中的posts 之后似乎缺少/
  • 哦,也许我应该试试@detail_route
  • 我的意思是:^users/posts.(?P[a-z0-9]+)/?$ 我认为应该是这样的:^users/posts/(?P[a-z0-9]+)/?$
  • @Cory,不,我只是使用了错误的装饰器,所以我无法获得特定用户的帖子
  • 这里有一些变化:@detail_route(),之后是def posts(self, request, pk)。现在它显示所有用户的帖子,但分页不起作用。尽管如此,路由器仍向我询问 pk(从未在代码中使用过)

标签: python django django-rest-framework


【解决方案1】:

观看次数:

@detail_route()
def posts(self, request, pk, page):
    user = self.get_object()
    post_set = Post.objects.filter(owner=user)
    paginator = Paginator(post_set, 16)
    serializer = PostSerializer(paginator.page(page), many=True, context={'request': request})
    return Response(serializer.data)

网址:

router = DefaultRouter()
router.register(r'posts', views.PostViewSet)
router.register(r'users', views.UserViewSet)
user_posts = views.UserViewSet.as_view({
    'get': 'posts'
})

urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^users/(?P<pk>\w+)/posts/(?P<page>[0-9]+)', user_posts),
]

【讨论】:

    【解决方案2】:
    class UserViewSet(viewsets.ReadOnlyModelViewSet):
        queryset = User.objects.all()
        serializer_class = UserSerializer
    
        @detail_route()
        def posts(self, request, pk):
            user = self.get_object()
            post_set = Post.objects.filter(owner=user)
            paginator = Paginator(post_set, 16)
            page= request.query_params.get('page', 1)
            serializer = PostSerializer(paginator.page(page), many=True, context={'request': request})
            return Response(serializer.data)
    

    urls.py

    router.register('user', UserViewSet)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-09
      • 2021-01-16
      • 2016-05-27
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多