Django内置的序列化和反序列化

序列化数据

序列化格式

标识符信息
xml序列化和反序列化为一种简单地 XML 方言。
json序列化和反序列化为 JSON
yaml序列化为 YAML(YAML 不是标记语言)。此序列化器仅在 PyYAML 安装后可

以下用json为例:

在最高层面,你可以像这样序列化数据:

from django.http import JsonResponse
from django.core import serializers
def ab_ser(request):
    user_queryset =User.objects.all()

    # 序列化
    res = serializers.serialize('json',user_queryset)
    """会自动帮你将数据变成json格式的字符串 并且内部非常的全面"""
    return HttpResponse(res)

也可以直接使用序列化器对象

JsonSerializer = serializers.get_serializer("xml")
json_serializer =JsonSerializer()
json_serializer.serialize(queryset)
data = json_serializer.getvalue()

如果你只希望序列化字段的子集(一部分字段),则可以为序列化程序指定 fields 参数

from django.core import serializers
data = serializers.serialize('json',User.objects.all(), fields=('name','size'))

fields 中包含的字段都将被序列化

注解

根据你的模型,你可能会发现无法反序列化一个仅序列化了其字段子集的模型。如果已序列化的对象未指定模型所需的所有字段,则反序列化器将无法保存反序列化的实例。

存在继承关系的模型

class Place(models.Model):
    name = models.CharField(max_length=50)

class Restaurant(Place):
    serves_hot_dogs = models.BooleanField(default=False)

如果你有一个使用 抽象基类 定义的模型,那么你不必做任何特殊的事情来序列化该模型。对要序列化的一个(或多个)对象调用序列化程序,输出将是序列化对象的完整表示形式。

但是,如果你有一个使用 多表继承 的模型, 则还需要序列化该模型的所有基类。这是因为只有在模型上本地定义的字段才会被序列化。例如,考虑以下模型

如果你只序列化 Restaurant 模型:

data = serializers.serialize('xml', Restaurant.objects.all())

序列化输出上的字段将仅包含 serves_hot_dogs 属性。基类的 name 属性将被忽略。

为了完全序列化你的 Restaurant 实例,你还需要将 Place 模型序列化:

all_objects = [*Restaurant.objects.all(), *Place.objects.all()]
data = serializers.serialize('xml', all_objects)

反序列化数据

反序列化数据与序列化数据非常相似:

for obj in serializers.deserialize("json", data):
    do_something_with(obj)

如你所见,deserialize 函数与 serialize 函数采用相同的格式参数,字符串或数据流,并返回一个迭代器。

不过,这里有点复杂。deserialize 迭代器返回的对象 不是 常规的 Django 对象。相反,它们是特殊的 DeserializedObject 实例,实例封装了一个已创建 -- 但未保存 -- 的对象和任何相关联的数据。

调用 DeserializedObject.save() 保存对象到数据库

注解

如果序列化数据中的 pk 属性不存在或为 null,则会将新实例保存到数据库中

这可以确保反序列化是一个非破坏性操作,即使序列化表示中的数据与数据库中当前的数据不匹配。通常,使用这些 DeserializedObject 实例看起来像:

for deserialized_object in serializers.deserialize("json", data):
    if object_should_be_saved(deserialized_object):
        deserialized_object.save()

换句话说,通常的用途是检查反序列化的对象,以确保它们“适合”保存。如果你信任数据源,则可以直接保存对象并继续前进。

Django 对象本身可以被像 deserialized_object.object 一样检查。如果模型中不存在序列化字段,将引发 DeserializationError 错误,除非将 ignorenonexistent 参数为 True 传入:

serializers.deserialize("json", data, ignorenonexistent=True)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值