Я пытаюсь сделать что-то вроде этих предлагаемых декораторов сигналов. Помимо декоратора, который соединяет декорированный метод с сигналом (с отправителем сигнала в качестве аргумента для декоратора), я хотел бы использовать декоратор для методов класса.
Я бы хотел использовать декоратор так:
class ModelA(Model):
@connect.post_save(ModelB)
@classmethod
def observe_model_b_saved(cls, sender, instance, created, **kwargs):
# do some stuff
pass
Декоратор:
from django.db.models import signals
def post_save(sender):
def decorator(view):
signals.post_save.connect(sender=sender, receiver=view)
return view
return decorator
Когда я это делаю, я получаю следующую ошибку:
File "/Library/Python/2.6/site-packages//lib/python2.6/site-packages/django/dispatch/dispatcher.py", line 78, in connect AssertionError: Signal receivers must be callable.
Я предполагаю, что проблема в том, что @classmethod
возвращает объект метода класса, который нельзя вызвать. Я действительно не понимаю, как classmethod
работает под капотом, но предполагаю, что эта справочная страница что объект метода класса не переводится в вызываемый объект до тех пор, пока к нему не будет осуществлен доступ из класса, например ModelA.observe_model_b_saved
. Есть ли способ, которым я могу (1) определить свой метод как метод класса или экземпляра в модели и (2) подключить его к сигналу, используя декоратор непосредственно в определении метода? Спасибо!