为什么变量不能与 Django 信号中的 "instance" 一起使用?
Why don't variables work with "instance" in Django signals?
有效:
@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" 或将其视为文字。在变量上使用字符串方法没有帮助。在文档中找不到任何内容。
In the second case, django ignores the variable "foo" or treats it as a literal.
它不会忽略这一点,您只需设置名称为 .foo
的属性,事实上名称为 foo
的变量存在,并且不知何故有一个字符串,这无关紧要.这就是 Python 的工作原理。
你可以做的是利用 setattr
builtin function [Pyton-doc]:
@receiver(pre_save, sender=MyModel)
def some_signal_function(sender, instance, *args, **kwargs):
foo = 'field_name'
<b>setattr(</b>instance, foo, 'bar'<b>)</b>
所以 setattr(x, 'y', z)
等价于 x.y = z
.
有效:
@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" 或将其视为文字。在变量上使用字符串方法没有帮助。在文档中找不到任何内容。
In the second case, django ignores the variable "foo" or treats it as a literal.
它不会忽略这一点,您只需设置名称为 .foo
的属性,事实上名称为 foo
的变量存在,并且不知何故有一个字符串,这无关紧要.这就是 Python 的工作原理。
你可以做的是利用 setattr
builtin function [Pyton-doc]:
@receiver(pre_save, sender=MyModel)
def some_signal_function(sender, instance, *args, **kwargs):
foo = 'field_name'
<b>setattr(</b>instance, foo, 'bar'<b>)</b>
所以 setattr(x, 'y', z)
等价于 x.y = z
.