Django批量更新以触发save()

6

我需要重新保存所有的模型

Users.objects.all().update(active=True)

在模型中:

 def save(self, *args, **kwargs):
        self.url = "XYZ"

        super(User, self).save(*args, **kwargs)

然而,上述操作不会触发这些模型的save()方法。因此,没有设置url = XYZ。这种情况可能吗?

更新:

看起来我无法使用.update()实现这一点。我尝试过这样做:

>>> objects = Users.objects.all()
>>> for item in objects:
...     item.save()

你能详细阐述一下动机吗?描述一下使用情况。谢谢。 - alecxe
1
我认为无论OP试图做什么,都可以通过数据库触发器更有效地完成。 - Kevin
@alecxe 当然,我使用自己的方法覆盖了模型的Save()方法。这只是在保存时向数据库添加了一些额外的内容。似乎运行上面的命令并不会触发模型的Save()方法。 - Prometheus
@Kevin 更新了原帖以反映我想要做的事情。 - Prometheus
如果 catavaran 的解决方案对你来说不够高效,你可以在 SQL 侧设置触发器以自动设置 URL。具体的语法取决于你的 SQL 后端(如 MySQL、Postgres、Oracle 等)。 - Kevin
1个回答

6

不,这是不可能的:

请意识到update()在SQL层面进行更新,因此不会调用任何模型的save()方法,也不会发出pre_save或post_save信号(这些信号是调用Model.save()的结果)。如果你想更新一个具有自定义save()方法的模型的一堆记录,请遍历它们并调用save()

$ ./manage.py shell
Python 2.7.6 (default, Mar 22 2014, 22:59:38) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.contrib.auth.models import User
>>> for u in User.objects.all():
...     u.is_active = True
...     u.save()
... 
>>> 

我明白了,所以我需要循环遍历每个对象并在Django中保存?这可以在shell中完成吗? - Prometheus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接