您好
如何在update()
检索到的单个模型上使用Queryset.get()
方法?似乎model. Model
没有update()方法但我无法调用.save(),因为我有一个预先保存的信号,这会让事情变得混乱。
编辑:一个想法是将一些参数传递给save方法并在pre_save信号中捕获它,这样我就可以理解其目的,如何做到这一点?
由于
答案 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