non sono sicuro se questo è il modo del tutto corretto per farlo, ma funziona per le mie esigenze. Usa Django Paginator e un serializzatore personalizzato.
Qui è la mia Visualizzazione classi che recupera gli oggetti per la serializzazione
class CourseListView(AuthView):
def get(self, request, format=None):
"""
Returns a JSON response with a listing of course objects
"""
courses = Course.objects.order_by('name').all()
serializer = PaginatedCourseSerializer(courses, request, 25)
return Response(serializer.data)
Ecco il hacked insieme Serializzatore che usa il mio serializzatore Course.
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
class PaginatedCourseSerializer():
def __init__(self, courses, request, num):
paginator = Paginator(courses, num)
page = request.QUERY_PARAMS.get('page')
try:
courses = paginator.page(page)
except PageNotAnInteger:
courses = paginator.page(1)
except EmptyPage:
courses = paginator.page(paginator.num_pages)
count = paginator.count
previous = None if not courses.has_previous() else courses.previous_page_number()
next = None if not courses.has_next() else courses.next_page_number()
serializer = CourseSerializer(courses, many=True)
self.data = {'count':count,'previous':previous,
'next':next,'courses':serializer.data}
Questo mi dà un risultato che è simile al comportamento che il vecchio cercapersone ha dato.
{
"previous": 1,
"next": 3,
"courses": [...],
"count": 384
}
Spero che questo aiuti. Penso ancora che ci sia un modo migliore per farlo con la nuova API, ma non è documentato bene. Se capisco qualcosa di più, modifico il mio post.
EDIT
Credo di aver trovato un modo migliore e più elegante per farlo bey creare il mio paginator personalizzato per ottenere un comportamento come ho usato per ottenere con la vecchia classe impaginato Serializer.
Questa è una classe di impaginatore personalizzata. Ho sovraccaricato la risposta e i metodi della pagina successiva per ottenere il risultato desiderato (ad esempio ?page=2
anziché l'URL completo).
from rest_framework.response import Response
from rest_framework.utils.urls import replace_query_param
class CustomCoursePaginator(pagination.PageNumberPagination):
def get_paginated_response(self, data):
return Response({'count': self.page.paginator.count,
'next': self.get_next_link(),
'previous': self.get_previous_link(),
'courses': data})
def get_next_link(self):
if not self.page.has_next():
return None
page_number = self.page.next_page_number()
return replace_query_param('', self.page_query_param, page_number)
def get_previous_link(self):
if not self.page.has_previous():
return None
page_number = self.page.previous_page_number()
return replace_query_param('', self.page_query_param, page_number)
Poi mio punto di vista, naturalmente, è molto simile a come è stato implementato esso, solo questa volta usando il Paginator personalizzato.
class CourseListView(AuthView):
def get(self, request, format=None):
"""
Returns a JSON response with a listing of course objects
"""
courses = Course.objects.order_by('name').all()
paginator = CustomCoursePaginator()
result_page = paginator.paginate_queryset(courses, request)
serializer = CourseSerializer(result_page, many=True)
return paginator.get_paginated_response(serializer.data)
Ora ho ottenuto il risultato che sto cercando.
{
"count": 384,
"next": "?page=3",
"previous": "?page=1",
"courses": []
}
io non sono ancora sicuro di come questo funziona per l'API sfogliabile (io non uso questa funzione di DRF). Penso che tu possa anche creare la tua classe personalizzata per questo. Spero che aiuti!
Mi sono appena imbattuto in questo stesso identico problema. Ho deciso di aggiornare tutti i miei pacchetti e questa è stata l'unica cosa che si è rotta. Spero che questo risponda perché non ho trovato nulla neanche io. – Brobin
"Ho appena aggiornato Django Rest Framework 3.1 e sembra che si sia scatenato l'inferno." Lol. – jmoz