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

5 浏览
0 Comments

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

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

但实际上,在Postgresql上执行一个使用create()创建一堆模型实例的方法时,我得到了transaction aborted, commands ignored until end of transaction的异常。该方法在非事务性的数据库后端上运行良好。此外,当我用以下代码替换create():

m = Model(attr1=..., attr2=...)
m.save()

在Postgresql上也能正常运行。

在事务方面,使用save()create()之间有什么区别吗?

编辑:在调用save()之前,create()还会设置self._for_write = True,但我无法追踪它是否对事务行为产生任何影响。

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

0
0 Comments

Django中的save()和create()方法在事务处理方面有什么区别?

从上述内容中可以看出,create()只是save()的一个包装器。其中_for_write部分可能只是用于选择数据库,所以不必太在意它。

关于“事务中止”错误,不知道你的代码是什么样的,很难说出问题在哪里。可能是使用create()违反了唯一约束,导致PostgreSQL要求回滚事务,然后你尝试使用不同的数据进行save()操作,没有精确的代码很难确定。

谢谢回复。我在问题中添加了一个示例代码的链接。如果需要进一步澄清,请告诉我。

可能是某种事务问题,比如这个:stackoverflow.com/questions/2235318/…(注意这是特定于MySQL的),但是看了你的代码后我发现两个版本不是等价的。工作版本通过slug进行get()操作,然后使用name进行create()操作,而另一个版本使用name和slug进行create()操作。所以可能是这个不对称导致的问题。

0