django - 如何在不反转 Django 数据库中的对象值的情况下制作 obj.save()

标签 django

我有递归函数,里面有 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/

相关文章:

python - Django: atomic(): Force transaction, raise AssertionError 如果已经在事务中

python - Django:合并迁移冲突的最佳方式

python - Django:Django-Rest-Framework 给出归因错误(分页)

python - 如何将pdf文件添加到django响应中

Django ModelForm 不将数据保存到数据库

django - Django中子查询的查询

javascript - Django:在 URL 反向调用中使用 Javascript 变量作为参数

mysql - 我可以避免 django (python) 的 MySQL 表中的冗余主键列吗?

python - 使用 Django 实现单点登录 (SSO)

python - 在夹层中切换数据库后端