我正在使用 Django Python 框架和 MySQL DBMS。
在下面的屏幕截图中,我使用 SurveyDraft.objects.create() 创建 new_survey_draft 对象,如图所示,假设它应该在surveydraft 数据库表,但也如屏幕截图所示,在调试我的代码后,使用 id=pk=270 创建了 new_survey_draft 对象> ,而右侧另一个窗口中显示的数据库表没有带有 id=270 的新行。
即使在对象实例化后调用的 publish_survey_draft() 中设置断点,我也调用了 SurveyDraft.objects.get(pk=270) ,它返回了对象,但数据库表中仍然没有 id=270。
最后,在恢复代码并从所有定义返回后,该行已成功添加到带有 id=270 的数据库表中。
我想知道所看到的背后发生了什么,Django是否有可能将数据存储在对象中而不实时持久化到数据库,而仅在稍后的执行点上将数据全部持久化?
我已经被困在这个问题上几个小时了,在网上找不到任何有用的东西,所以我非常感谢任何有关这个问题的建议。
最佳答案
深入研究这个问题后,我发现有一个名为原子请求的概念,通过将ATOMIC_REQUESTS设置为True在我的Django项目中启用 在 DATABASES 字典下的 settings.py 中,如所解释的 here
It works like this. Before calling a view function, Django starts a transaction. If the response is produced without problems, Django commits the transaction. If the view produces an exception, Django rolls back the transaction.
这就是为什么在使用断点调试代码时更改不会保留在数据库中,因为只有在返回成功响应后,更改才会提交到数据库。
关于python - Django 模型没有将数据实时保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40908465/