我有递归函数,里面有 obj.save() 。 如何防止每次迭代都从数据库查询? 是 django transaction.atomic 做的。
最佳答案
如果您使用的是 django >= 2.2(自从我在 2020 年 1 月 5 日写这篇文章时 ALL other versions of django are 100% out of support 起,您应该使用它),您可以这样做:
objs = []
for obj in Entry.objects.filter(...):
if not obj.condition:
continue
obj.headline = 'something!!!'
obj.author = 'John Smith'
objs.append(obj)
with transaction.atomic():
Entry.objects.bulk_update(objs, ['headline', 'author'])
需要注意的几点:
- 所有工作都在
transaction.atomic
之外完成 transaction.atomic
意味着如果该 block 内有任何失败,它将回滚整个工作(事务)并且不会保留其中的一部分。示例:您有 2 个作者要保存,第一个成功保存,第二个没有。因为在事务原子内部,这意味着它们都未提交。它与在一个查询中完成所有操作无关
更多信息可以在这里找到:https://docs.djangoproject.com/en/3.1/ref/models/querysets/#bulk-update
关于django - 如何在不反转 Django 数据库中的对象值的情况下制作 obj.save(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65577934/