一、引子
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()
新聞熱點
疑難解答