Я пытаюсь сделать что-то вроде этих предложенных декораторов сигналов . В дополнение к наличию декоратора, который соединяет декорированный метод с сигналом (с отправителем сигнала в качестве аргумента декоратору), я хотел бы использовать декоратор в методах класса.
Я бы хотел использовать декоратор так:
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
работает под капотом, но из этой справочной страницы я предполагаю, что объект метода класса не переводится в вызываемый объект до тех пор, пока к нему не получит доступ класс, например 1018 *. Есть ли способ, которым я могу (1) определить мой метод как метод класса или экземпляра в модели и (2) подключить его к сигналу, используя декоратор непосредственно в определении метода? Спасибо!