Jos*_*idt 5 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'
Run Code Online (Sandbox Code Playgroud)
即它期望能够修改 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'])
Run Code Online (Sandbox Code Playgroud)
生成的 UPDATE 语句将如下所示:
UPDATE "myapp_mymodel" SET "othercolumn" = 'spam' WHERE "myapp_mymodel"."id" = 100
Run Code Online (Sandbox Code Playgroud)
缺少预保存中“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()
Run Code Online (Sandbox Code Playgroud)
请注意额外的“instance.save()”调用。
但您必须确保在执行instance.somecolumn = 'eggs' 后,some_condition() 不再为True。如果没有,则会导致保存/预保存/保存/预保存调用循环