Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在指定更新字段时使用预保存_Python_Django_Django Signals - Fatal编程技术网

Python 在指定更新字段时使用预保存

Python 在指定更新字段时使用预保存,python,django,django-signals,Python,Django,Django Signals,我在MyModel上定义了一个pre_save,如下所示: @receiver(预保存,发送方=MyModel) def_mymodel_pre_save(发送方、实例,**kwargs): 如果某个条件() instance.somecolumn='eggs' i、 e.它希望能够修改MyModel实例的某些属性,当然也希望在save()调用期间保留这些更改。我相信这是pre_save函数的典型用法。只要save()调用不指定update\u字段,这就可以正常工作 我想知道现在是否有安全合理

我在MyModel上定义了一个pre_save,如下所示:

@receiver(预保存,发送方=MyModel)
def_mymodel_pre_save(发送方、实例,**kwargs):
如果某个条件()
instance.somecolumn='eggs'
i、 e.它希望能够修改MyModel实例的某些属性,当然也希望在save()调用期间保留这些更改。我相信这是pre_save函数的典型用法。只要save()调用不指定update\u字段,这就可以正常工作

我想知道现在是否有安全合理的方法在MyModel实例的save()调用中使用update_字段。如果我天真地打电话:

myinstance=MyModel.objects.get(id=100)
myinstance.othercolumn='spam'
保存(更新_字段=['othercolumn'])
生成的UPDATE语句如下所示:

更新“myapp\u mymodel”设置“othercolumn”=“spam”,其中“myapp\u mymodel”。“id”=100
缺少预保存中“somecolumn”的预期更新。我想,通过查看pre_save函数可用的update_字段(作为冻结集),可以从pre_save内部检测到这种情况,但是我看不到pre_save在调用方具有更严格的update_字段集时强制进行其预期更改的任何方法,如上面的示例所示。或者有什么解决办法吗?

解决办法是:

@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'后,某些_条件()不再为真。
如果没有,它将导致一个save/pre-save/save/pre-save调用循环

区别在于save可以用于更新或插入查询,因此您必须更改update_字段,我相信如果设置了update_字段,您可以检查pre_-save信号,如果设置了,那么您可以更改并追加?update_fields.append('somecolumn')。还没有尝试过,但您可以检查它是否有效。@petkostas否,正如我在总结中提到的,update_字段作为冻结集提供给pre_save函数,也就是说,它不能从此处更改。