用于自动或手动将序列化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从SOAP响应获取值   prolog中不允许使用java StAX解析器内容   JAVA项目中,创建一个由4行11列组成的显示表   java原子写入Spring可变bean   完整的worddatabase for JavaApp检查一个单词是否是一个合法的单词,在这种情况下SQL是否合适?   java如何将数组字节转换为组织。w3c。多姆。文件   运行Spring MVC应用程序时出现java JBoss错误   java为什么scanner类与BufferedReader相比需要较长的时间   java jaxb2mavenplugin仅执行第一次执行   java有什么方法可以使活动在单击每个按钮时做出不同的反应?   对java开发人员学习数据结构和算法有何建议   lambda我对java函数签名有疑问   java使用Maven创建三层应用程序   java Hadoop分布式文件系统是否像Google文件系统一样支持任何更新操作?   按下按钮后,swing Java Key事件不会执行   java JPA Hibernate删除实体关系中的孤立项   java将负数输入到数字反转程序中   java在OpenCV中无阻塞地从回调方法获取图像