我正在使用Django Python框架和MySQL DBMS。
在下面的屏幕截图中,我正在使用 SurveyDraft.objects.create()创建 new_survey_draft 对象,如下所示,假设它应该创建一个新行 surveydraft 数据库表,但也在屏幕截图中显示,在调试我的代码后, new_survey_draft 对象是使用 id = pk = 270 ,而右边另一个窗口中显示的数据库表没有 id = 270 的新行。
即使在对象实例化后调用的 publish_survey_draft()中设置断点,我也调用了 SurveyDraft.objects.get(pk = 270),它返回了对象,但数据库表中仍然没有 id = 270 。
最后,在恢复代码并从所有定义返回后,该行已成功添加到数据库表中,其中 id = 270 。
我想知道看到后面发生了什么,Django是否有可能将数据存储在对象中而不会实时保存到数据库中,并且只能在以后的执行点上将所有数据保存在一起?
我已经被困在这里好几个小时了,在网上找不到任何有用的东西,所以我非常感谢你对这个问题的任何建议。
答案 0 :(得分:0)
深入研究这个问题之后,我发现在我的Django项目中启用了一个名为 Atomic Requests 的概念,方法是将 ATOMIC_REQUESTS设置为True 在DATABASES字典下的settings.py中,如here所述
它的工作原理如下。在调用视图函数之前,Django启动了一个 交易。如果生成的响应没有问题,Django 提交交易。如果视图产生异常,Django 回滚交易。
这就是为什么在使用断点调试我的代码时,更改不会持久存储在数据库中,因为只有在返回成功响应后,更改才会提交给数据库。