我有模型Word
class Word(models.Model):
group_id = models.IntegerField()
old_group_id = models.IntegerField(default=0)
我有一些单词查询:
words = Word.objects.filter(...)
现在我希望每个词都将old_group_id
设置为group_id
类似words.update(old_group_id=group_id)
到目前为止,我通过遍历每个单词来做到这一点,但这并不十分有效:
for word in words:
word.old_group_id = word.group_id
word.save()
答案 0 :(得分:2)
您可以使用F
objects。
words.update(old_group_id=F('group_id'))
答案 1 :(得分:1)
您可以使用 F(..)
表达式来做到这一点:
from django.db.models import F
Word.objects.filter(...).update(old_group_id=F('group_id'))
F
-expression [Django-doc]是一种引用模型字段的方法,而不是使用值(您也可以使用双下划线来查看“通过”关系)。
因此,上述结果将导致类似以下查询:
UPDATE word
SET old_group_id = group_id
WHERE ...
因此,更新是在数据库级别 完成的。因此,在Django / Python方面不涉及任何迭代。因此,这将(几乎)总是胜过在Django / Python层更改模型对象的效果:它将查询量从 O(n)减少到 O(1),而且通常对数据库进行优化以“批量”更新。