我在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
缺少pre_save中“ somecolumn”的预期更新。我猜可以通过查看pre_save函数(作为冻结集)可用的update_fields从pre_save内部检测到这种情况,但是我看不到有任何方法可以使pre_save强制在需要时进行预期的更改如上例所示,调用者具有更严格的update_fields集。还是有任何解决方法?
解决方法是:
@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。否则,将导致保存/预保存/保存/预保存调用的循环
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句