通过另一个属性django更改模型属性

时间:2018-08-21 12:57:30

标签: django python-3.x

我有模型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()

2 个答案:

答案 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),而且通常对数据库进行优化以“批量”更新。