Reputation: 66
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
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
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