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

时间:2010-11-17 16:41:29

标签: django transactions commit

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

但实际上,在Postgresql上使用create()执行一个创建一堆模型实例的方法我得到transaction aborted, commands ignored until end of transaction异常。该方法适用于非事务性数据库后端。另外,当我用:

替换create()时
m = Model(attr1=..., attr2=...)
m.save()

它也可以在Postgresql上运行。

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

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

编辑:可以找到示例代码here

1 个答案:

答案 0 :(得分:13)

正如您所见,create() is just a wrapper for save()

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

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