TOP

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'))

序列化外键字段

外键字段处理默认是返回 id,  查看较为不便不够在直观

添加以下两个参数, 可以指定使用 关联模型的  natural_key  方法返回结果替换

    obj = serializers.serialize('json', [PermissionRole.objects.get(id=pk)],
                                use_natural_foreign_keys=True,
                                ensure_ascii=False)

 

在关联的视图下, 重写此方法即可

    def natural_key(self):
        return self.__str__()

反序列化数据

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

 

posted @ 2019-02-02 19:30  羊驼之歌  阅读(597)  评论(0编辑  收藏  举报