Django 序列化 序列化 使用模块及方法 序列化指定字段 反序列化数据 总结 补充 

背景

对于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