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