Core.Serializers 模块
Django 序列化模块
模块结构
.
├── __init__.py
├── base.py
├── json.py
├── jsonl.py
├── python.py
├── pyyaml.py
└── xml_serializer.py1 directory, 7 files
自定义序列化器
通过继承django.core.serializers.base.Serializer
类,可以自定义序列化器。
def serialize(self,queryset,*,stream=None,fields=None,use_natural_foreign_keys=False,use_natural_primary_keys=False,progress_output=None,object_count=0,**options,):"""Serialize a queryset."""self.options = optionsself.stream = stream if stream is not None else self.stream_class()self.selected_fields = fieldsself.use_natural_foreign_keys = use_natural_foreign_keysself.use_natural_primary_keys = use_natural_primary_keysprogress_bar = self.progress_class(progress_output, object_count)self.start_serialization()self.first = Truefor count, obj in enumerate(queryset, start=1):self.start_object(obj)# Use the concrete parent class' _meta instead of the object's _meta# This is to avoid local_fields problems for proxy models. Refs #17717.concrete_model = obj._meta.concrete_model# When using natural primary keys, retrieve the pk field of the# parent for multi-table inheritance child models. That field must# be serialized, otherwise deserialization isn't possible.if self.use_natural_primary_keys:pk = concrete_model._meta.pkpk_parent = (pk if pk.remote_field and pk.remote_field.parent_link else None)else:pk_parent = Nonefor field in concrete_model._meta.local_fields:if field.serialize or field is pk_parent:if field.remote_field is None:if (self.selected_fields is Noneor field.attname in self.selected_fields):self.handle_field(obj, field)else:if (self.selected_fields is Noneor field.attname[:-3] in self.selected_fields):self.handle_fk_field(obj, field)for field in concrete_model._meta.local_many_to_many:if field.serialize:if (self.selected_fields is Noneor field.attname in self.selected_fields):self.handle_m2m_field(obj, field)self.end_object(obj)progress_bar.update(count)self.first = self.first and Falseself.end_serialization()return self.getvalue()
start_serialization
方法
序列化开始,可以在这个方法内定义一些初始化操作,或者日志或者提前的数据准备工作。
start_object
方法
每个对象序列化开始时调用。
end_object
方法
每个对象序列化结束时调用。
handle_field
方法
对象字段序列化时调用。
handle_fk_field
方法
处理外键字段时调用。
handle_m2m_field
方法
处理多对多字段时调用。
getvalue
方法
返回序列化结果。
总结
Django 提供了一系列格式的序列化器使用,包括json
,jsonl
,yaml
,xml
,python
等。
通过继承Serializer
类,可以自定义序列化器。自定义后的序列化器可以通过在settings.py
配置 SERIALIZATION_MODULES 变量将自定义的序列化器注册到 Django serializers 工作流中,而无需使用时自己调用。
# settings.py
SERIALIZATION_MODULES = {"msgpack": "path.to.msgpack.Serializer",
}# other.py
from django.core import serializersserializers.serialize("msgpack", queryset) # 避免了项目中直接导入自定义序列化器使用