gpt4 book ai didi

python - 在指定 update_fields 时使用 pre_save

转载 作者:行者123 更新时间:2023-11-28 18:42:02 25 4
gpt4 key购买 nike

我在 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。否则,将导致保存/预保存/保存/预保存调用循环

关于python - 在指定 update_fields 时使用 pre_save,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25123960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com