首页 > 解决方案 > 如何在 for 循环中更新 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' object has no attribute 'update'

标签: django

解决方案


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

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

话虽这么说,上面的效率很低。因为对于n 个对象,它最多会进行n+1 个查询。

您可以在这里简单地将条件移动到过滤器部分:

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

推荐阅读