Может ли сигнал Django pre_save работать для всех производных классов - PullRequest
3 голосов
/ 07 августа 2010

У меня есть модельный класс "Action", который расширен несколькими другими классами. Я новичок в django и предположил, что если бы я вызвал pre_save.connect (actionFunc, sender = Action), то actionFunc вызывался бы каждый раз, когда вызывался метод save в классе Action (в том числе любым производным классом).

Мое наблюдение состоит в том, что эта функция срабатывает только тогда, когда экземпляр является прямым соответствием типа Class, определенного в Sender. Есть ли способ получить это, чтобы получать сигналы и для всех производных экземпляров Action?

Ответы [ 2 ]

1 голос
/ 08 августа 2010

Нет, вы должны звонить на pre_save.connect столько раз, сколько вам нужно.

Однако вы можете использовать python, чтобы получить все классы, которые расширяют интересующий вас класс, и выполнить цикл над оператором pre_save connect.

Скажем, если расширенные классы Action находятся в данном файле, вы можете сделать следующее:

global_dict = globals().copy()
[el for el in global_dict.values() if getattr(el,'__base__',None)==Action]
0 голосов
/ 11 августа 2010

одна вещь, которую вы можете сделать, это изменить отправителя сигнала в django так, чтобы вместо сопоставления с определенным типом он вместо этого делал

if isinstance(sender, filter):
    send_signal()

(псевдокод)

...