zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    从搜索引擎角度看SEO
    关键词排名与网站优化有哪三大误区?
    真正提升关键词排名的外链应该怎样发?
    高质量外链的十大特性
    四个方面分析SEO如何提高网站的权重
    Linux(ubuntu)使用dd从iso制作win7安装u盘(读卡器一样),以及备份分区
    折腾slidingmenu
    生命游戏介绍
    21232f297a57a5a743894a0e4a801fc3
    final关键字
  • 原文地址:https://www.cnblogs.com/shijieli/p/10349036.html
Copyright © 2011-2022 走看看