django - 如何在 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'
解决方案
正如您自己发现的那样,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)
推荐阅读
- c# - Navisworks,如何获得有关 ModelItemCollection 的位置
- c# - 同时在 2 个不同的环境(DEV 和 STaging)上运行测试,而这两个环境都有 2 个不同的 url
- java - 将双精度值转换为压缩十进制 COBOL 格式 PIC S9(5)V9(4) COMP-3/压缩十进制 COBOL 格式 PIC S9(3)V9(4) JAVA 中的 COMP-3 格式
- python - 如何将 python 中的两个字典列表与可能不同的键值对合并?
- discord - 创建消息组件(按钮) discord.js
- html - 如何在 bootstrap.min.css 文件中应用更改
- php - 有没有办法在 sabre api 中检查或创建保留线?
- java - 为什么单击按钮时不显示数组中的随机单词?
- asp.net - 是否有在 Mac 上运行的 ILogger / EventLog 的替代 .NET 日志记录类?
- c# - 将表名作为参数传递给 SqlCommand 的问题