用于自动或手动将序列化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第三方库


热门话题
java使用ApachePOI将excel文件导入postgreSQL表   java多线程从iText pdf提取文本   winapi Java和SetWindowDisplayAffinity   eclipse juno的java Websphere 6.1插件   java MPAndroidChart:为Y轴提供一些偏移   java中作为参数传递枚举类型的继承   java Gui jframe的工作原理与netbeans不同   使用Bouncy Castle和PDFBox在Java中验证PDF签名   优化缩小Java代码   java无法在安卓中从Firebase取回子数据   返回的java方法?我应该什么时候用?   java错误处理已完成,退出代码为1。与穿过阵列的for循环有关   多线程Java volatile是否阻止缓存或强制执行写缓存?   java Multi-collectItems如何提前终止并返回已收集的项目   java为什么不在服务(请求,响应)中直接调用processRequest(请求,响应)?   java如何从字符串生成int数组?   打印获取用户输入的值并在其他预选文本中显示。JAVA   未显示java DynamicAsper UTF8字符   java Eclipse RCP:不启动应用程序的命令行参数