Я использую разбиение на страницы Django с jQuery. Я могу сериализировать список объектов объекта разбиения на страницы, но я хотел бы сериализировать целый объект получить больше данных (номер страницы, общее количество страниц...). Как я могу сериализировать целый объект разбиения на страницы?
Спасибо
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)
Мне только что пришлось сделать для этого хакерское решение, поэтому я отправлю его в качестве ответа - любые улучшения приветствуются:
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