通过类定义序列化/反序列化对象及其关系
项目描述
内容
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)
初始版本