Django:从事务角度看save()和create()之间的区别

oma*_*mat 13 django transactions commit

Django中的create()方法创建一个模型实例,然后调用save(),据说触发提交.因此触发事务的提交应该没有任何区别.

但实际上,在Postgresql上使用create()创建一组模型实例的方法我得到了transaction aborted, commands ignored until end of transaction异常.该方法适用于非事务性数据库后端.另外,当我用以下内容替换create()时:

m = Model(attr1=..., attr2=...)
m.save()
Run Code Online (Sandbox Code Playgroud)

它也可以在Postgresql上运行.

使用save()create()交易意义上有区别吗?

edit: create()也在self._for_write = True调用save()之前设置,但我无法跟踪它以查看它是否对事务行为有任何影响.

编辑:示例代码可以在这里找到.

Tom*_*ski 13

你可能已经看过,create()它只是一个包装器save():

_for_write部分最有可能仅用于数据库选择,因此我不会过多关注它.

关于"交易中止"错误,如果没有看到您的代码,很难说出问题是什么.也许您违反了使用create()的UNIQUE约束,这会导致PostgreSQL要求事务回滚,然后您尝试save()使用不同的数据 - 如果没有确切的代码,很难说清楚.