9
votes

Toute façon de sérialiser un objet de pagination à Django?

J'utilise django pagination avec jQuery. Je peux sérialiser la liste des objets de l'objet de pagination, mais je voudrais sérialiser l'objet entier pour obtenir plus de données (numéro de page, nombre total de pages ...). Comment puis-je sérialiser l'objet de pagination entier?

merci

JavaScript xxx

vues.py xxx


1 commentaires

Je ne sais pas si fonctionne si vous travaillez, mais vous pouvez essayer avec code.google.com/p/jsonpickle


3 Réponses :


5
votes

Je viens de faire une solution hacky pour cela afin que je posterai comme une réponse - toute amélioration Bienvenue:

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                               


0 commentaires

2
votes

the django reseframework offre une spéciale paginationerializer qui fait exactement ce que vous voulez, je suppose.


1 commentaires

PaginationSerializer a été supprimé dans la version 3.1 DRF 3.1. Stackoverflow.com/ Questions / 31500192 / ...



5
votes

Ma suggestion est de jeter l'objet du paginateur et de trancher le query vous-même. De cette façon, vous pouvez facilement sérialiser la sortie.

Par exemple, voici comment vous voudrez peut-être faire cela si vous voulez sérialiser une liste de commentaires au format JSON: P>

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


0 commentaires