我在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集时,如上例所示。或者有解决方法吗?
答案 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。 如果没有,它将导致一个保存/预存/保存/预保存呼叫循环