如何在 Django 的管理命令中管理事务?

Geo*_*gie 5 python django django-admin

我只是想知道如何在 django 的管理命令中管理事务。承诺保存?致力于成功?我在官方文档中找不到相关信息。

and*_*sit 5

除非您告诉它们,否则管理命令操作不会包含在事务中。

您可以通过将output_transaction属性设置为 True来告诉handle()方法包装在事务中。从文档

BaseCommand.output_transaction

一个布尔值,指示命令是否输出 SQL 语句;如果为 True,输出将自动用 BEGIN 包装;和承诺;。默认值为假。

为了获得更多控制权,您始终可以自己发起交易:

...
def handle(self, *args, **options):
    with transaction.atomic():
        do_your_stuff()
Run Code Online (Sandbox Code Playgroud)

  • 供将来参考:我最近也对“output_transaction”抱有希望,但事实证明它只是关于任何打印的 SQL 输出,而不是关于命令中可能执行的实际查询。查看 django 内部命令(总是很有趣),似乎只有“loaddata”使用事务,并使用此答案中描述的包装器。 (3认同)
  • 添加 `output_transaction = True` 对我来说不起作用(即使 `handle()` 中的代码引发错误,数据库更改仍然存在),但按照您的第二个建议手动启动事务效果很好。我还找到了这个事务控制命令的模板:https://gist.github.com/marcoala/a176ee0e75771a826a1197cc69336580 (2认同)

moh*_*666 -1

我不太确定,但管理表单除非满足 clean() 要求,否则不会到达提交点。在那之后我想一切都会被承诺。对于管理中的默认表单来说,此行为应该足够了。但是,对于更复杂的表单,您可以创建自定义管理表单,并且我很确定您可以定义是否要在成功时提交或在保存时提交。