【问题标题】:Any way to serialize a pagination object in Django?有什么方法可以在 Django 中序列化分页对象?
【发布时间】:2010-12-25 16:08:45
【问题描述】:

我正在使用带有 jQ​​uery 的 Django 分页。我可以序列化分页对象的对象列表,但我想序列化整个对象以获取更多数据(页码、总页数......)。 如何序列化整个分页对象?

谢谢

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)

【问题讨论】:

标签: jquery django pagination


【解决方案1】:

我只需要为此制定一个 hacky 解决方案,因此我会将其作为答案发布 - 欢迎任何改进:

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】:

    我的建议是丢弃分页器对象并自己切片查询集。这样您就可以轻松地序列化输出。

    例如,如果您想将 cmets 列表序列化为 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))
    

    【讨论】:

      【解决方案3】:

      django Restframework 提供了一个特殊的PaginationSerializer,我猜它就是你想要的。

      【讨论】:

      猜你喜欢
      • 2010-09-27
      • 2013-10-12
      • 2018-08-07
      • 2012-06-10
      • 1970-01-01
      • 2010-11-21
      • 2013-10-10
      • 2018-09-06
      • 1970-01-01
      相关资源
      最近更新 更多