通过类定义序列化/反序列化对象及其关系
项目描述
内容
django-deep-serializer
使用 django-deep-serializer,您可以通过类定义序列化/反序列化对象及其关系
要求
django (>=1.4, 可能适用于以前的版本)
PyYAML(>=3.10,仅当您想使用此序列化程序时才可选)
django-form-admin (>=0.4.2, 仅示例项目可选)
安装
如果你想使用自然键,你可以使用内部序列化器这些是从 django git 存储库获得的。这些不在任何稳定的分支或版本中。您必须在设置中写入:
SERIALIZATION_MODULES = {
"xml" : "deep_serializer.serializers.xml_serializer",
"python" : "deep_serializer.serializers.python",
"json" : "deep_serializer.serializers.json",
#"yaml" : "deep_serializer.serializers.pyyaml",
}
用例
序列化(使用主键或自然键)对象及其关系。有时 django 无法序列化应用程序。例如,如果您尝试序列化示例项目中的“example.app”应用程序,您将收到下一个错误:“CommandError: Unable to serialize database: Can't resolve dependencies for app.Page, app.WebSite in serialized app list. ”
反序列化(使用主键或自然键)一些对象
克隆(使用自然键)一个对象。要做到这一点,您可以序列化,更新主对象的自然键,然后反序列化这些对象
恢复对象及其关系,(使用主键或自然键)
如何使用
这个想法是用很少的行实现一个序列化器或/和一个反序列化器。这些必须能够定义一些“规则”。示例项目中有五个示例(五个不同的用例)。例如:
class WebSiteClone(MyMetaWalkClass):
@classmethod
def pre_serialize(cls, initial_obj, obj, request, serialize_options=None):
obj = super(WebSiteClone, cls).pre_serialize(initial_obj, obj,
request,
serialize_options=serialize_options)
new_title = '%s-%s' % (obj.title, time.time())
obj.title = new_title[:200]
obj.slug = get_hash()
obj.original_website_id = obj.pk
obj.initial_page = None
return obj
@classmethod
def walking_into_class(cls, initial_obj, obj, field_name, model, request=None):
if field_name in ('initial_page', 'websites_created_of'):
return WALKING_STOP
elif field_name in ('original_website', 'owners'):
return ONLY_REFERENCE
elif field_name == 'page':
return WALKING_INTO_CLASS
update_the_serializer(obj, field_name)
class PageClone(MyMetaWalkClass):
@classmethod
def pre_serialize(cls, initial_obj, obj, request, serialize_options=None):
obj = super(PageClone, cls).pre_serialize(initial_obj,
obj, request,
serialize_options=serialize_options)
obj.website = initial_obj
obj.created_from_id = obj.pk
return obj
@classmethod
def walking_into_class(cls, initial_obj, obj, field_name, model, request=None):
if field_name in ('pages_created_of', 'website', 'website_initial_page'):
return WALKING_STOP
elif field_name in ('created_from', 'last_editor'):
return ONLY_REFERENCE
update_the_serializer(obj, field_name)
@classmethod
def post_save(cls, initial_obj, obj, request=None):
super(PageClone, cls).post_save(initial_obj, obj, request=request)
initial_page = obj.created_from.website.initial_page
if initial_page and obj.slug == initial_page.slug:
obj.website.initial_page = obj
obj.website.save()
def clone_website(website, format='python'):
walking_classes = {WebSite: WebSiteClone,
Page: PageClone,
User: BaseMetaWalkClass}
natural_keys = True
fixtures = serializer(format, website,
walking_classes=walking_classes,
natural_keys=natural_keys)
return deserializer(format, fixtures,
initial_obj=website,
walking_classes=walking_classes,
natural_keys=natural_keys)
你可以在moocng 项目中看到一个真实的例子
发展
您可以通过克隆其 git 存储库来获得 django-deep-serializer 的最新版本:
git clone https://github.com/goinnn/django-deep-serializer
测试项目
在源代码树中,您将找到一个名为“example”的目录。它包含一个使用 django-deep-serializer 的易于设置的项目。你可以像往常一样运行它:
python manage.py syncdb --noinput python manage.py loaddata app_data.json python manage.py runserver
发布
0.1.3 (2014-10-13)
支持 Django 1.7
0.1.2 (2013-11-14)
小细节
0.1.1 (2013-11-13)
将测试添加到 django 1.6
更新 django 1.5 版本,从 1.5.4 到 1.5.5
0.1.0 (2013-11-05)
修复反序列化器和固定装置格式为 XML 时的错误
引发异常时添加消息
示例项目中序列化表单的改进
修复序列化时的一个小错误,格式为python
重新排序和重构代码。存在向后不兼容的更改,例如方法参数的重新排序
测试中的改进
0.0.1 (2013-10-29)
初始版本