0

I am trying to add pagination in lates Django REST framework, how can I provide pagination inside tracks field because tracks can be more than 1-2 k?

{
    'album_name': 'The Grey Album',
    'artist': 'Danger Mouse'
    'tracks': [
               {'title': 'Public Service Announcement'},
               {'title': 'What More Can I Say'},
               {'title': 'Encore'},
               ............ 1k
              ],
}
kojibhy
  • 51
  • 1
  • 5

1 Answers1

0

Hope you are using viewset, but it will work without it. if you are bad with viewsets you can read about them here: http://www.django-rest-framework.org/api-guide/viewsets/

views.py

from django.core.paginator import Paginator
...
class AlbumViewSet(viewsets.ModelViewSet):
queryset = Album.objects.all()
serializer_class = AlbumSerializer

@detail_route()
def tracks(self, request, pk, page):

    # if you want to use url: albums/<album_id>/tracks/page/
    track_set = Tracks.objects.get(album_id=int(pk))

    # elif you want to use url: albums/<album_name>/tracks/page/
    track_set = Tracks.objects.get(album_album_name=pk)

    paginator = Paginator(track_set, page_size) # ! change page_size to yours
    serializer = TrackSerializer(paginator.page(page), many=True, context={'request': request})
    return Response(serializer.data)

urls.py. If you dont use routers read docks and use them with a ViewSet instead of your ClassView, but that will work without them as well. (routers: http://www.django-rest-framework.org/api-guide/routers/ )

# little router example
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'albums', views.PostViewSet)
# end little router example

user_posts = views.AlbumViewSet.as_view({
    'get': 'tracks'
})
urlpatterns = [
     ...
     url(r'^albums/(?P<pk>\w+)/tracks/(?P<page>[0-9]+)/', user_posts),
     ...
]

Now you can fetch url like this: albums/my_name_is_jeff/tracks/1 or albums/5/tracks/1. All code is required except 'little router example', and yep it`ll be silly to use it with simple ClassBasedView

Michael
  • 66
  • 6