用于自动或手动将序列化django模型实例导出到版本控制存储库的灵活库
django-vcexport的Python项目详细描述
工作原理
有一个应用程序级api和一个模型级api。
使用模型级API定义每个模型类的导出行为 保存时自动导出。
使用应用程序级API定义视图中的导出行为(对于 示例)并显式触发从您自己的代码导出内容。
模型级api
设计灵感来自于django的面向方面的modeladmin和modelform 模式。核心行为在 vcexport.models.exporter中定义。 类,它类似于modeladmin。像modeladmin和modelform一样,您 将子类化默认基,以便根据每个模型自定义行为。
对于模型的自动版本控制,请向vcexport注册:
import vcexport vcexport.register(MyModel)
这将连接后置保存信号。
通过子类化,可以根据每个模型自定义导出行为。 vcexport.models.exporter 并告诉vcexport向注册您的模型 自定义导出程序:
class MyExporter(vcexport.models.Exporter): ... vcexport.register(MyModel, exporter=MyExporter)
默认情况下,模型被序列化为django的xml格式,因为 适用于 diff 并且是通用的。
您可以通过传递自定义的 模板路径作为类属性:
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行情>- 您想要批发版车型
- 您有一个模型,它有一个或两个类似于文档的文本字段, 你只想修改那些字段-不要写出来 序列化模板中的任何其他字段。
默认情况下,模型实例的文档转储将保存在 存储库路径类似于 /app_name/modelclassname/instance_pk
您可以自定义路径:
class MyExporter(Exporter): def repository_path(self): return '/my_custom/path_for/this_model/' + self.object.color
注意,如果这样做,可能会导致多个模型实例 保存到存储库中相同的文件路径。这是一项功能。
默认提交用户未定义。现在你不能 自定义此项。
默认的提交消息是无趣的:"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这将返回 如果操作未导致提交的更改,则为"提交"或"无"。
如果您想这样做,您可能不想注册相同的 自动邮政储蓄出口模式-但也许你会!