1. 程式人生 > >7.7 Django 序列化

7.7 Django 序列化

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‘> return
HttpResponse(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 序列化