Почему переменные не работают с «экземпляром» в сигналах Django? - PullRequest
1 голос
/ 29 мая 2020

Это работает:

@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» или рассматривает ее как буквальный. Использование строкового метода для переменной не помогает. Ничего не нашел в документации.

1 Ответ

2 голосов
/ 29 мая 2020

Во втором случае django игнорирует переменную «foo» или рассматривает ее как литерал.

Это не игнорируется, вы просто устанавливаете атрибут с именем .foo, факт, что переменная с именем foo существует, и как-то имеет строку, не имеет значения. Вот как работает Python.

Что вы можете сделать, так это использовать встроенную функцию setattr [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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...