跳转到主要内容

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

项目描述

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:无法序列化数据库:无法解决序列化应用列表中对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 (22.8 kB 查看哈希值)

上传时间 源代码

由以下支持