通过类定义序列化/反序列化对象及其关系
项目描述
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:无法序列化数据库:无法解决序列化应用列表中对app.Page,app.WebSite的依赖。”
反序列化(使用主键或自然键)一些对象
克隆(使用自然键)一个对象。要做到这一点,您可以序列化,更新自然键为主对象,然后在反序列化这些对象之后
恢复对象及其关系(使用主键或自然键)
如何使用
目标是实现一个序列化器或/和反序列化器,只需几行代码。这些需要能够定义一些“规则”。在示例项目中有五个示例(五个不同的用例)。例如:
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时的一个bug
在抛出异常时添加消息
在示例项目中改进了序列化形式
修复了在序列化且格式为python时出现的一个小错误
重新排序和重构代码。 有一些向后不兼容的更改,例如方法参数的重新排序
测试方面的改进
0.0.1 (2013-10-29)
初始版本
项目详情
django-deep-serializer-0.1.3.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7054f4d51f345748a52d2b867431040657421de74c6d2c8623082fdfb7d418d0 |
|
MD5 | 532d138549bff2e4b73a1ce25a08d690 |
|
BLAKE2b-256 | 379a5a2221c42bdc42ccf5b7621b72b6fd48023e0fee224f1ff725c2157c12f9 |