Michael
Michael

Reputation: 66

ViewSet and Router in rest framework

Had a problem with rest framework: building api with a viewset and router.

I want api to serialize the user's posts by url like that: /api/users/user id/posts/page, but router can`t stand it. It suggest me that regexp in patterns:

^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)

Have any ideas how to compel this work correctly? Thanks in advance!

Upvotes: 1

Views: 567

Answers (2)

Ykh
Ykh

Reputation: 7717

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)

Upvotes: 0

Michael
Michael

Reputation: 66

views:

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

urls:

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),
]

Upvotes: 1

Related Questions