Django更新单个模型

时间:2011-01-04 08:25:11

标签: django django-models

您好 如何在update()检索到的单个模型上使用Queryset.get()方法?似乎model. Model没有update()方法但我无法调用.save(),因为我有一个预先保存的信号,这会让事情变得混乱。

编辑:一个想法是将一些参数传递给save方法并在pre_save信号中捕获它,这样我就可以理解其目的,如何做到这一点?

由于

3 个答案:

答案 0 :(得分:2)

我建议使用save方法更新正确的方法。也许你可以将代码从预存储移动到后保存并检查创建的标志。或者重载保存方法并执行您必须执行的操作。另一个想法是做这样的事情:

User.objects.filter(pk=1)[0:1].update()

此切片语法返回一个QuerySet,您可以在其上调用更新方法。你甚至可以在没有切片的情况下调用它,但是理论上你在理论上更新的不仅仅是你的一个模型。除非您使用主键或其他内容进行过滤,否则就是。

重载保存方法:

class MyModel(models.Model):

    def save(self, some_value, *args, **kwargs):
        # do your pre-save stuff here
        super(MyModel, self).save(*args, **kwargs)

如果需要,您甚至可以从save方法返回或在调用原始保存方法之前抛出异常。然后模型不会保存。我不认为可以做一些事情,比如将参数从save方法传递给信号。但是,您可以将其他参数传递给save方法,然后在调用super方法时省略它们(我更新了示例)。

答案 1 :(得分:1)

update()方法是批量方法。您不能在单个实例上使用它。 你可以这样做

obj = ...get(...)
XX.objects.filter(id=obj.id).update(..)

但是如果presave发出错误,你可能正在处理一个不一致的实例。

答案 2 :(得分:0)

在QuerySet上调用update()方法不会调用任何信号,也不会使用模型的save()方法。 See Django QuerySet documentation

我将看一下Disqus对Model实例的原子更新的作用。

见幻灯片30: http://www.scribd.com/doc/37072033/DjangoCon-2010-Scaling-Disqus