通过类定义序列化/反序列化对象及其关系
django-deep-serializer的Python项目详细描述
内容
django-deep-serializer
使用django deep serializer,您可以通过类定义序列化/反序列化对象及其关系
Requeriments
- django(>;=1.4,这可能适用于以前的版本)
- PyYAML(>;=3.10,仅当需要使用此序列化程序时才可选)
- django-form-admin(>;=0.4.2,仅对示例项目可选)
Installation
如果您想要使用自然键,那么您已经使用了从django git存储库获得的internal serializers。这些都不在任何稳定的分支或释放。您必须在设置中写入:
SERIALIZATION_MODULES = { "xml" : "deep_serializer.serializers.xml_serializer", "python" : "deep_serializer.serializers.python", "json" : "deep_serializer.serializers.json", #"yaml" : "deep_serializer.serializers.pyyaml", }
Use cases
- 序列化(使用主键或自然键)对象及其关系。有时django无法序列化应用程序。例如,如果您尝试序列化示例项目中的“example.app”应用程序,则会出现下一个错误:“commanderror:无法序列化数据库:无法解析序列化应用程序列表中app.page、app.website的依赖关系。”
- 反序列化(使用主键或自然键)某些对象
- 克隆(使用自然键)对象。若要执行序列化,请更新主对象的自然键,然后反序列化这些对象
- 还原对象及其关系(使用主键或自然键)
How to use
想法是用很少的行实现序列化器或/和反序列化器。它们必须能够定义一些“规则”。 在example project中有五个示例(五个不同的用例)。例如:
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 project
中看到一个真正的示例Development
通过克隆,您可以获得django deep serializer的最后一个出血边缘版本 它的git存储库:
git clone https://github.com/goinnn/django-deep-serializer
Test project
在源代码树中,您将找到一个名为“example”的目录。它包含 使用django深度序列化程序的易于设置的项目。您可以像往常一样运行它:
python manage.py syncdb --noinput python manage.py loaddata app_data.json python manage.py runserver
Releases
0.1.3 (2014-10-13)
- 支持Django 1.7
0.1.1 (2013-11-13)
- 向django 1.6添加测试
- 将django 1.5版本从1.5.4更新到1.5.5
0.1.0 (2013-11-05)
- 修复反序列化程序时的错误,fixtures的格式为xml
- 引发异常时添加消息
- 示例项目中序列化表单的改进
- 修正序列化时的一个小错误,格式是python
- 重新排序并重构代码。存在向后不兼容的更改类似于对方法的参数重新排序
- 测试的改进