序列化数据
序列化格式
标识符 | 信息 |
---|---|
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)