2009-12-11 4 views
7

Używam paginacji Django z jQuery. Mogę serializować listę obiektów obiektu do stronicowania, ale chcę serializować cały obiekt, aby uzyskać więcej danych (numer strony, całkowita liczba stron ...). Jak można serializować cały obiekt stronicowania?Jakikolwiek sposób serializować obiekt stronicowania w Django?

Dzięki

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

Nie mam pewności, czy prace, ale można spróbować się od http: // code .google.com/p/jsonpickle/ – diegueus9

Odpowiedz

4

Właśnie miał dokonać hacky rozwiązanie tego więc będę pisać go jako odpowiedź - wszelkie usprawnienia mile widziane:

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

django Restframework oferuje specjalny PaginationSerializer, który robi dokładnie to, co chcesz.

+1

'PaginationSerializer' został usunięty w wersji DRF 3.1. http://stackoverflow.com/questions/31500192/django-rest-framework-error- cannon-import-name-paginationserializer –

5

Moja sugestia to odrzucenie obiektu paginatora & samodzielnie wyciąć kwerendę. w ten sposób można łatwo serializować dane wyjściowe.

jako przykład, oto jak może chcesz zrobić, że jeśli chcesz serializacji listę komentarzy w formacie 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))