Python 如何在Django中为模型提交数据库事务?
示例I有两种型号:Python 如何在Django中为模型提交数据库事务?,python,django,transactions,pusher,Python,Django,Transactions,Pusher,示例I有两种型号: class Customer: ... class ImportResult: ... 我想将客户从文件导入我们的数据库,并更新导入结果进度。下面是示例代码: with transaction.atomic(): Customer.objects.create(**data) import_result.update_progress() import_result.save() 问题是,由于导入\u结果也在事务内部,因此在更新时我无法
class Customer:
...
class ImportResult:
...
我想将客户
从文件导入我们的数据库,并更新导入结果
进度。下面是示例代码:
with transaction.atomic():
Customer.objects.create(**data)
import_result.update_progress()
import_result.save()
问题是,由于
导入\u结果
也在事务内部,因此在更新时我无法获得进度。数据仅在事务完成时提交到数据库。注意,当调用update\u progress()
时,我们使用Pusher
实时更新web。因此,问题是是否存在例外或强制import\u result
立即提交到数据库?这个问题需要更多细节<代码>导入\u结果似乎是一个模型实例。您的意思是update\u progress()
在事务中运行吗?什么是“进展”?它是ImportResult
上的数据库字段吗?在事务完成之前,您在哪里尝试获取该值并使用它?我在您发布的代码中看不到这一点。@KevinChristopherHenryimport\u result
在Customer
模型的交易中运行。是progress
是一个字段import\u result
示例数据应[“步骤1完成”、“步骤2失败”、“导入失败”]
。所以进度已经保存了,我所做的是通过Pusher
将import\u result
id发送到前端(angular),所以前端只需要调用/api/import\u result/id/
来获得更新的数据,但由于它在事务中,所以它还没有提交到数据库,所以我无法获得最新的数据,答案是否定的。你不能两全其美。如果您希望更新进度时出现故障,那么将该更新放在一个事务中是没有意义的,该事务将在出现故障时回滚。为什么在上面的代码中有transaction.atomic()
呢?@KevinChristopherHenry因为我需要回滚Customer
模型,如果有任何东西失败了。同时,我需要更新进度。获得所需内容的唯一方法是将更新代码放在单独的事务中,这意味着单独的数据库连接。Django并不直接支持这一点,但如果你环顾四周,就会发现这一点。