Django .update 不会调用重写的 save 吗?

4 投票
1 回答
6530 浏览
提问于 2025-05-10 15:47

我正在尝试在模型中调用这个重写的保存方法:

def save(self, *args, **kwargs):
    if self.done is True:
        if self.averagepa is None:
            pass
        elif self.averagepa < 26:
            self.links = 5
        elif self.averagepa < 31:
            self.links = 10
        elif self.averagepa < 36:
            self.links = 15
        elif self.averagepa < 41:
            self.links = 20
        else:
            self.links = 99
super(KW, self).save(*args, **kwargs)

如果我只是通过管理面板保存模型,这个方法运行得很好。但是当我尝试通过 ./manage.py shell 这样更新它时:

KW.objects.filter(id=138).update()

这个方法就没有被触发。请问我该如何在命令行中更新时调用这个重写的保存方法呢?

相关文章:

  • 暂无相关问题
暂无标签

1 个回答

17

这是关于 update() 方法的 官方说明

要注意的是,update() 方法会直接转换成 SQL 语句。这是一种批量操作,用于直接更新数据。它不会在你的模型上运行任何 save() 方法,也不会触发 save() 方法相关的前后信号(这些信号是调用 save() 时产生的),也不会考虑 auto_now 字段选项。如果你想保存 QuerySet 中的每一项,并确保每个实例都调用了 save() 方法,你不需要任何特别的函数来处理这个。只需遍历它们并调用 save() 即可。

在你的情况下:

kw = KW.objects.get(id=138)
# update kw
kw.save()

撰写回答