用于自动或手动将序列化django模型实例导出到版本控制存储库的灵活库

django-vcexport的Python项目详细描述


工作原理

有一个应用程序级api和一个模型级api。

使用模型级API定义每个模型类的导出行为 保存时自动导出。

使用应用程序级API定义视图中的导出行为(对于 示例)并显式触发从您自己的代码导出内容。

模型级api

设计灵感来自于django的面向方面的modeladmin和modelform 模式。核心行为在 vcexport.models.exporter中定义。 类,它类似于modeladmin。像modeladmin和modelform一样,您 将子类化默认基,以便根据每个模型自定义行为。

  1. 对于模型的自动版本控制,请向vcexport注册:

    import vcexport
    vcexport.register(MyModel)
    

    这将连接后置保存信号。

  2. 通过子类化,可以根据每个模型自定义导出行为。 vcexport.models.exporter 并告诉vcexport向注册您的模型 自定义导出程序:

    class MyExporter(vcexport.models.Exporter):
      ...
    vcexport.register(MyModel, exporter=MyExporter)
    
  3. 默认情况下,模型被序列化为django的xml格式,因为 适用于 diff 并且是通用的。

  4. 您可以通过传递自定义的 模板路径作为类属性:

    class MyExporter(Exporter):
        repository_template = 'fleem/document_format.txt'
    

    模板将用两个上下文变量呈现; 对象 它是已保存的模型实例,并创建了一个布尔值

    {% if created %}New object!{% endif %}
    {{object.title}}
    {{object.related_field.pk}}
      ****
    Color: {{object.color}}
    {{object.description}}
    

    这允许支持备用用例:

    < Buff行情>
    • 您想要批发版车型
    • 您有一个模型,它有一个或两个类似于文档的文本字段, 你只想修改那些字段-不要写出来 序列化模板中的任何其他字段。
  5. 默认情况下,模型实例的文档转储将保存在 存储库路径类似于 /app_name/modelclassname/instance_pk

    您可以自定义路径:

    class MyExporter(Exporter):
        def repository_path(self):
            return '/my_custom/path_for/this_model/' + self.object.color
    

    注意,如果这样做,可能会导致多个模型实例 保存到存储库中相同的文件路径。这是一项功能。

  6. 默认提交用户未定义。现在你不能 自定义此项。

    默认的提交消息是无趣的:"object{{instance.pk}" (来自Django VCExport保存的{{app_name}.{{model_name}')。

    可以使用模型方法自定义提交消息 获取创建的布尔值 ,并返回一个字符串:

    class MyExporter(Exporter):
        def repository_commit_message(self, created):
            if created:
                return "User %s committed a new %s" % (
                  self.object.user.username, self.object.color)
            return "User %s committed %s" % (self.object.user.username,
                                             self.object.color)
    

应用程序级api

也可以显式导出内容,例如在模型的 save() 方法、视图代码等,使用 vcexport.export_to_repository 功能:

def my_view(request):
    ...
    object = MyModel.objects.get(...)
    object.morx = request.POST['new_morx']
    object.save()

    import vcexport
    vcexport.export_to_repository(object)

默认模板、提交消息等与模型api相同。 您可以在自己的代码中自定义它们,并将它们传递到 导出到存储库

def my_view(request):
    ...
    object, created = MyModel.objects.get_or_create(...)
    object.morx = request.POST['new_morx']
    object.save()

    import vcexport
    vcexport.export_to_repository(
               object, created=created,
               repository_template='fleem/morx.html',
               message="Changed the morx",
               repository_path='/fleem/objects/%s' % object.pk)

export_to_repository函数将返回提交的修订, 如果没有要提交的更改,则为"无"。

中间地带

您可能希望将您的行为分组既有组织上的好处 对出口商的定义,以及触发出口的灵活性 在应用程序代码中显式显示。

您可以直接调用导出器实例以满足此日元:

def my_view(request):
    ...
    object, created = MyModel.objects.get_or_create(...)
    object.morx = request.POST['new_morx']
    object.save()

    exporter = MyExporterSubclass(object)

    exporter.export_to_repository(object, created=created)

类似于vcexport.export_to_repository这将返回 如果操作未导致提交的更改,则为"提交"或"无"。

如果您想这样做,您可能不想注册相同的 自动邮政储蓄出口模式-但也许你会!

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

推荐PyPI第三方库


热门话题
使用硬件相关VM参数(重新)启动Java应用程序的正确方法?   java有一个Eclipse插件弹出菜单,只有在选择文件夹时才会出现   java演示简单Ajax ans Servelt实现失败   java如何在不需要OAuth授权的情况下代表组织用户提供密码   java检查一个字符串是否等于另一个字符串的子字符串   java我可以从for循环中的1开始初始化2D数组吗   使用选择排序的java排序2D数组   java如何在一轮投票后重新开始,而不在其中存储统计数据   我的Java代码不断向文本文件添加重复项   java MapReduce Hadoop字长频率不起作用   试图保存Iterable时执行独立工作时发生java错误   java这两个源是同一个场景生成器吗?   java计划重试关联的JMS消息