2009-12-11 9 views
7

Estoy usando la paginación de Django con jQuery. Puedo serializar la lista de objetos del objeto de paginación, pero me gustaría serializar todo el objeto para obtener más datos (número de página, número total de páginas ...). ¿Cómo puedo serializar todo el objeto de paginación?¿Hay alguna forma de serializar un objeto de paginación en Django?

Gracias

Javascript

function getRestaurants(query) { 

     $.post("/getRestaurant/", query, 
      function(data) { 
       /* do stuff with data */ 
      },"json"); 
} 

views.py

def getRestaurant(request): 

    results = Restaurant.objects.all() 
    paginator = Paginator(restaurants, 5) 

    # Make sure page request is an int. If not, deliver first page. 
    try: 
     page = int(request.POST.get('page','1')) 
    except ValueError: 
     page = 1 

    # If page request (9999) is out of range, deliver last page of results. 
    try: 
     results = paginator.page(page) 
    except (EmptyPage, InvalidPage): 
     results = paginator.page(paginator.num_pages) 

    data=serializers.serialize("json", results.object_list) #I'd like to serialize the whole results object 

    return HttpResponse(data) 
+0

no lo hago seguro si funciona pero se puede tratar con http: // código .google.com/p/jsonpickle/ – diegueus9

Respuesta

4

acabo de tener que hacer una solución hacky para esto, así que voy a publicar como una respuesta - cualquier mejoras bienvenidas:

from django.core import serializers 
from django.core.paginator import Paginator, InvalidPage, EmptyPage 
from django.core.serializers.json import DjangoJSONEncoder 
from django.http import HttpResponse 
from django.utils import simplejson 
from types import MethodType 

from mysite.tasks.models import Task 

PER_PAGE = 20 

def list(request): 
    """ 
    Return a paginated JSON object. 
    """ 

    paginator = Paginator(tasks.objects.all(), PER_PAGE) 
    try: 
     page = int(request.GET.get('page', '1')) 
    except ValueError: 
     page = 1 

    # If page request (9999) is out of range, deliver last page of results. 
    try: 
     pagetasks = paginator.page(page) 
    except (EmptyPage, InvalidPage): 
     pagetasks = paginator.page(paginator.num_pages) 

    # Dump the Page attributes we want to a dictionary 
    serializedpage = {} 
    wanted = ("end_index", "has_next", "has_other_pages", "has_previous", 
      "next_page_number", "number", "start_index", "previous_page_number") 
    for attr in wanted: 
     v = getattr(tasks, attr) 
     if isinstance(v, MethodType): 
      serializedpage[attr] = v() 
     elif isinstance(v, (str, int)): 
      serializedpage[attr] = v 

    # Serialise the queryset to plain Python objects 
    # and add them to the serialized page dictionary 
    pythonserializer = serializers.get_serializer("python")() 
    serializedpage["object_list"] = pythonserializer.serialize(pagetasks.object_list, 
      fields=('task_id', 'task_data')) 

    # Dump it as JSON using the Django encoder 
    response = HttpResponse(mimetype="application/json") 
    simplejson.dump(serializedpage, response, cls=DjangoJSONEncoder) 
    return response        
2

El django Restframework ofrece un número especial PaginationSerializer que hace exactamente lo que usted quiere, supongo.

+1

'PaginationSerializer' se eliminó en la versión DRF 3.1. http://stackoverflow.com/questions/31500192/django-rest-framework-error-cannot-import-name-paginationserializer –

5

mi sugerencia es descartar el objeto del paginador & cortar el conjunto de preguntas usted mismo. De esta forma, podría serializar fácilmente la salida.

como ejemplo, aquí es cómo es posible que quieras hacer eso si quieres serializar una lista de comentarios en formato JSON:

comment_list = ArticleComment.objects.filter(article__id=int(_id), is_public=True).values('created', 'tag', 'content', 'author').order_by('-created') 
    start = (page_num - 1) * COMMENTS_PER_PAGE 
    end = page_num * COMMENTS_PER_PAGE 
    return HttpResponse(json.dumps(list(comment_list[start:end]), cls=DjangoJSONEncoder)) 
Cuestiones relacionadas