我有一个在一个线程中运行的任务,它将在很长一段时间后保存其输入数据。 Django通常会保存可能在此期间发生变化的整个对象。我也不想运行该事务,因为它将失败或阻止其他任务。我的解决方案是重新加载数据并保存结果。这是要走的路还是有一些乐观的锁定方案,部分保存或我应该使用的其他东西?
我的解决方案:
with transaction.atomic():
obj = mod.TheModel.objects.get(id=the_id)
# Work the task
with transaction.atomic():
obj = mod.TheObject.objects.get(id=obj.id)
obj.result = result
obj.save()
答案 0 :(得分:0)
通常,如果您不想阻止执行长时间操作的其他任务,您希望这些操作是异步的。
存在用Django执行此类任务的库。最着名的可能是http://www.celeryproject.org/
答案 1 :(得分:0)
我建议通过Django QuerySet's update
method使用部分保存。 save
method on instances中有一个update_fields
关键字参数,用于限制要保存的字段。但是,save方法本身的任何逻辑都可能依赖于其他最新的数据。为此目的,有一个相对较新的instance update_from_db
method。但是,如果您的保存方法没有被覆盖,那么两者都会产生完全相同的SQL。 update
可以避免任何潜在的数据完整性问题。
示例:
num_changed = mod.TheObject.objects.filter(id=obj.id).update(result=result)
if num_changed == 0:
# Handle as you would have handled DoesNotExist from your get call