7.7 Django 序列化
阿新 • • 發佈:2019-02-02
mem orm 示例 前端 import serial lte 傳值 eat
背景
對於Django 的queryset 對象在傳遞給 前端的時候,前端是無法識別的
因此需要存在一個轉換過程將 queryset 對象轉換成 字符串前端才可以識別
演示
QuerySet 無法被 json 序列化,因此無法傳值給前端
from django.shortcuts import render, HttpResponse from app01 import models import json # Create your views here. def index(request): user = models.User.objects.all() data= json.dumps(user) return HttpResponse(locals())
TypeError: Object of type QuerySet is not JSON serializable
使用模塊及方法
Django為我們提供了一個強大的序列化工具serializers。使用它也很簡單
示例
from django.shortcuts import render, HttpResponse from app01 import models from django.core import serializers # Create your views here.def index(request): user = models.User.objects.all() print(user) data = serializers.serialize("json",user) print("data:",data) # data: [{"model": "app01.user", "pk": 1, "fields": {"name": "yang", "password": "123456"}}] print(type(data)) # <class ‘str‘> returnHttpResponse(data)
參數
- "json" 數據格式,
- QuerySet 要序列化的數據對象,數據通常是ORM模型的QuerySet,一個可叠代的對象。
註意
對於具體的對象,無法進行序列化,請使用filter轉換成 QuerySet 對象後在使用。
還有某幾個版本之前的貌似時間格式也沒法序列化。目前我用的 1.10.11已經支持時間字段的序列化了。
from django.shortcuts import render, HttpResponse from app01 import models from django.core import serializers # Create your views here. def index(request): user = models.User.objects.all().first() print(user) # yang print(type(user)) # <class ‘app01.models.User‘> data = serializers.serialize("json",user) # TypeError: ‘User‘ object is not iterable print("data:",data) print(type(data)) return HttpResponse(data)
序列化指定字段
只想序列化某些指定的字段,可以使用fields參數
from django.core import serializers data = serializers.serialize(‘xml‘, SomeModel.objects.all(), fields=(‘name‘,‘size‘))
反序列化數據
for obj in serializers.deserialize("xml", data): do_something_with(obj)
總結
對於 這個 序列化方式並不是很推薦
他返回的數據會很多很雜亂很不方便使用,
後期我們會使用 另一個更加方便的序列化工具。這個僅作了解。
(沒錯,就是 rest_framework 裏面的序列化組件)
補充 :
JsonResponse 使用
可以進行序列化 ,但是不能對model對象以及 QuerySet對象序列化
示例
from django.shortcuts import render, HttpResponse from django.http import JsonResponse from app01 import models from django.core import serializers import json # Create your views here. def index(request): dic = {"yang": "tuo"} # return HttpResponse(dic) # yang # return HttpResponse(dic.items()) # (‘yang‘, ‘tuo‘) # response = JsonResponse(dic) # return response # {"yang":"tuo"} # return JsonResponse(dic) # {"yang":"tuo"} # user = models.User.objects.all().first() # response = JsonResponse(user,safe=False) # return response # Object of type User is not JSON serializable # user = models.User.objects.all() # response = JsonResponse(user, safe=False) # return response # Object of type QuerySet is not JSON serializable
7.7 Django 序列化