Skip to main content

通过类定义序列化/反序列化对象及其关系

项目描述

<nav class="contents" id="contents" role="doc-toc">

内容

</nav>

django-deep-serializer

https://travis-ci.org/goinnn/django-deep-serializer.png?branch=master https://coveralls.io/repos/goinnn/django-deep-serializer/badge.png?branch=master https://badge.fury.io/py/django-deep-serializer.png https://pypip.in/d/django-deep-serializer/badge.png

使用 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)

  • 初始版本

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

django-deep-serializer-0.1.3.tar.gz (22.8 kB 查看哈希)

已上传 source