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
本文来自博客园,作者:羊驼之歌,转载请注明原文链接:https://www.cnblogs.com/shijieli/p/10349036.html