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

django-deep-serializer的Python项目详细描述


django-deep-serializer

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

使用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
  • 重新排序并重构代码。存在向后不兼容的更改类似于对方法的参数重新排序
  • 测试的改进

0.0.1 (2013-10-29)

  • 初始版本

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在饼图的图例中只包含每个类别的长描述?   json Grails应用程序,可以从Java DAO服务访问数据库如何访问控制器中的服务?   java将大型远程数据库表同步到本地数据库表,该表包含字段“lastModificationTime”   java如何在JFrame中创建交互式地图   web服务如何创建异步Java Restlet web服务?   java开始读取特定字节   java在jTable中返回不带SQL的搜索结果(带DAOMock)   jakarta ee java ee MVC模式,模型和视图是否直接相互通信   当由负载平衡器处理时,java Spring引导CSRF失败   java为什么JavaMail连接超时太长   java IzPack需要从安装程序安装JDK/JRE版本   java如何创建一个只接受实现Iterable的元素的方法   java spring数据存储库无法使用idClass保存实体   java如何从列表中删除重复项?   java在SocketChannel中发送大量数据时,影响速度的因素有哪些?   算法分支和绑定错误:节点1无法转换为java。可比的   java使用邮件API从Swing应用程序创建Jar文件   java枚举与简单常量声明?