为什么变量不能与 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.