为什么变量不能与 Django 信号中的"instance"一起使用?



这有效:

@receiver(pre_save, sender=MyModel)
def some_signal_function(sender, instance, *args, **kwargs):
instance.field_name = 'foo'
return None

。这将保存"foo"作为field_name。 足够简单。

但是为什么这不起作用:

@receiver(pre_save, sender=MyModel)
def some_signal_function(sender, instance, *args, **kwargs):
foo = 'field_name'
instance.foo = 'bar'
return None

在第二种情况下,django 忽略变量 "foo" 或将其视为文字。 对变量使用字符串方法无济于事。 在文档中找不到任何内容。

在第二种情况下,django 忽略变量 "foo" 或将其视为文字。

它不会忽略这一点,您只需使用名称设置属性.foo,存在名为foo的变量并且以某种方式具有字符串的事实,这无关紧要。这就是Python的工作方式。

你可以做的是利用setattr内置函数[Pyton-doc]:

@receiver(pre_save, sender=MyModel)
def some_signal_function(sender, instance, *args, **kwargs):
foo = 'field_name'
setattr(instance, foo, 'bar')

所以setattr(x, 'y', z)相当于x.y = z.

最新更新