django - 如何在 for 循环中更新 Django 查询对象

标签 django

我知道您可以使用以下方法更新与过滤器匹配的所有 Django 记录:

myQuery = myModel.objects.filter(fieldA = 1, FieldB = 2)
myQuery.update(fieldA = 5, FieldB = 6)

但是如果我想迭代查询结果并只更新某些值,我该怎么做? 我尝试过:

myQuery = myModel.objects.filter(fieldA = 1, FieldB = 2)
for item in range(myQuery.count())
    if (myQuery[item].fieldC) == 10:
        myQuery[item].update(fieldC = 100)

这将返回AttributeError:'myModel'对象没有属性'update'

最佳答案

正如您自己发现的那样,Model 对象没有 .update(..) 方法。您可以.save(..) [Django-doc]对象,并使用 update_fields=… parameter [Django-doc] 指定要更新的字段:

myQuery = myModel.objects.filter(fieldA=1, FieldB=2)
for item in myQuery:
    if item.fieldC == 10:
        item.fieldC = 100
        item.<b>save(update_fields=['fieldC'])</b>

话虽如此,上述方法非常效率低下。由于对于 n 个对象,总共最多会进行 n+1 次查询。

您可以简单地将条件移动到此处的过滤器部分:

myModel.objects.filter(fieldA=1, FieldB=2<b>, fieldC=10</b>).update(fieldC=100)

关于django - 如何在 for 循环中更新 Django 查询对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59570256/

相关文章:

python - 为什么我会收到 KeyError : 'scheduler' when trying to run a celery beat?

python - django-tracking 与 Django 1.6 不兼容

Django 1.8 条件注释导致 INNER JOIN 而不是 LEFT OUTER JOIN

python - 时区 "Eastern Standard Time"无法识别

Django:迭代数据库 View 的QuerySet

python - Django 将用户 ID 嵌入 URL 模板最佳实践

python - Django 表单字段 : Styling for Bootstrap without losing functionality?

python - CREATE EXTENSION postgis 后类型几何不存在

django - 序列化 Django 请求

python - django @login_required 装饰器错误