2009-12-11 6 views
7

Ich verwende Django Paginierung mit jQuery. Ich kann die Objektliste des Paginierungsobjekts serialisieren, aber ich möchte das gesamte Objekt serialisieren, um mehr Daten zu erhalten (Seitenzahl, Gesamtzahl der Seiten ...). Wie kann ich das gesamte Paginierungsobjekt serialisieren? Ich werde es als Antwort schreibenSie können ein Paginierungsobjekt in Django serialisieren?

Dank

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

i, wenn Arbeiten nicht sicher tun, aber Sie können mit http versuchen: // Code .google.com/p/jsonpickle/ – diegueus9

Antwort

4

Ich habe gerade eine hacky Lösung dafür machen musste so - alle Verbesserungen willkommen:

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

Die django Restframework bietet eine spezielle PaginationSerializer, die genau das tut, was Sie wollen, denke ich.

+1

'PaginationSerializer' wurde in der DRF 3.1-Version entfernt. http://stackoverflow.com/questions/31500192/django-rest-framework-error-cannot-import-name-paginationserializer –

5

mein Vorschlag ist, das Paginator-Objekt zu verwerfen & Slice die Abfrage selbst. Auf diese Weise können Sie die Ausgabe leicht serialisieren.

als Beispiel, hier ist, wie Sie das tun könnten wollen, dass, wenn Sie eine Liste von Kommentaren in JSON-Format serialisieren wollen:

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)) 
Verwandte Themen