首页 > 编程 > Python > 正文

Django分页查询并返回jsons数据(中文乱码解决方法)

2020-02-15 22:38:08
字体:
来源:转载
供稿:网友

一、引子

Django 分页查询并返回 json ,需要将返回的 queryset 序列化, demo 如下:

# coding=UTF-8import osfrom django.core import serializersfrom django.core.paginator import Paginator, PageNotAnInteger, EmptyPagefrom django.shortcuts import renderfrom django.http import HttpResponsefrom mypage.models import Product# Create your views here.def getAllProducts(request):  products_list = Product.objects.all()  paginator = Paginator(products_list, 10) # Show 10 products per page  page = request.GET.get('page', 0)  try:    products = paginator.page(page)  except PageNotAnInteger:    # If page is not an integer, deliver first page.    products = paginator.page(10)  except EmptyPage:    # If page is out of range (e.g. 9999), deliver last page of results.    products = paginator.page(paginator.num_pages)  json_data = serializers.serialize("json", products, ensure_ascii=False)  return HttpResponse(json_data, content_type='application/json; charset=utf-8')

很容易出现的一个错误是中文乱码,重点在于 json_data = serializers.serialize("json", products, ensure_ascii=False) 中第三个参数。

二、Serialize----序列化django对象

官方文档原文: https://docs.djangoproject.com/en/2.1/topics/serialization/

django的序列化框架提供了一个把django对象转换成其他格式的机制,通常这些其他的格式都是基于文本的并且用于通过一个管道发送django对象,但一个序列器是可能处理任何一个格式的(基于文本或者不是)

django的序列化类位于django.core下面的serializers文件夹里面,base.py文件里面定义了序列器和反序列器的基类以及一些异常, init .py文件定义了如何根据格式来选择对应的序列器等内容,我们一起来看看吧

init.py和base.py文件的函数原型如下图

def serialize(format, queryset, **options):"""Serialize a queryset (or any iterator that returns database objects) usinga certain serializer."""s = get_serializer(format)()s.serialize(queryset, **options)return s.getvalue()
class Serializer(object):  """  Abstract serializer base class.  """  # Indicates if the implemented serializer is only available for  # internal Django use.  internal_use_only = False  def serialize(self, queryset, **options):

那下面我们开始正式讲解django的序列化操作了

序列化数据

在最高层的api,序列化数据是非常容易的操作,看上面的函数可知,serialize函数接受一个格式和queryset,返回序列化后的数据:

简单的写法:

from django.core import serializersdata = serializers.serialize("xml", SomeModel.objects.all())

复杂的写法:

XMLSerializer = serializers.get_serializer("xml")xml_serializer = XMLSerializer()xml_serializer.serialize(queryset)data = xml_serializer.getvalue()            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表