在指定update_fields时使用pre_save

时间:2014-08-04 17:06:53

标签: python django django-signals

我在MyModel上定义了一个pre_save,它看起来像这样:

@receiver(pre_save, sender=MyModel)
def _mymodel_pre_save(sender, instance, **kwargs):
  if some_condition():
    instance.somecolumn = 'eggs'

即。它希望能够修改MyModel实例的某些属性,当然希望在save()调用期间保持这些更改。我相信这是pre_save函数的典型用法。只要save()调用未指定update_fields ,这样就可以正常

我想知道在此时是否有任何安全且合理的方法在MyModel实例的save()调用中使用update_fields。如果我天真地打电话:

myinstance = MyModel.objects.get(id=100)
myinstance.othercolumn = 'spam'
myinstance.save(update_fields=['othercolumn'])

生成的UPDATE语句如下所示:

UPDATE "myapp_mymodel" SET "othercolumn" = 'spam' WHERE "myapp_mymodel"."id" = 100

错过了" somecolumn"的预期更新来自pre_save。我想这个条件可以通过查看pre_save函数可用的update_fields(作为冻结集)从pre_save内部检测到,但是我无法看到pre_save强制其预期更改的任何方式当调用者具有更严格的update_fields集时,如上例所示。或者有解决方法吗?

1 个答案:

答案 0 :(得分:1)

解决方法是:

@receiver(pre_save, sender=MyModel)
def _mymodel_pre_save(sender, instance, **kwargs):
  if some_condition():
    instance.somecolumn = 'eggs'
    instance.save()

请注意额外的“instance.save()”调用。

但是你必须确保在instance.somecolumn ='eggs'执行后,some_condition()不再为True。 如果没有,它将导致一个保存/预存/保存/预保存呼叫循环