Как я могу использовать метод Django для метода модели?

Возможно, это только поздно, но я не могу понять, почему это не работает. Когда у меня есть сигнал post_save для вызова общей функции, он работает, но когда у меня есть сигнал post_save, вызывающий метод из модели, ничего не происходит. Вот код, который работает:

class Revision(models.Model):
    # Model junk...

def send_email(sender, instance, created, **kwargs):
    if created:
        print "DO STUFF"

signals.post_save.connect(send_email, sender=Revision)

Но это не работает:

class Revision(models.Model):
    # Model junk...

    def send_email(sender, instance, created, **kwargs):
        if created:
            print "DO STUFF"

signals.post_save.connect(Revision.send_email, sender=Revision)

Есть ли какая-то добродушная душа, которая заставит меня сломать мне голову в стену? Спасибо.

Ответы

Ответ 1

Мне кажется, что проблема во втором заключается в использовании неограниченного метода send_mail. Если вы действительно хотите вызвать send_mail из класса, возможно @classmethod или @staticmethod поможет вам:

class Revision(models.Model):
    # Model junk...

    @classmethod
    def send_email(cls, sender, instance, created, **kwargs):
        if created:
            print "DO STUFF"

signals.post_save.connect(Revision.send_email, sender=Revision)

или

class Revision(models.Model):
    # Model junk...

    @staticmethod
    def send_email(sender, instance, created, **kwargs):
        if created:
            print "DO STUFF"

signals.post_save.connect(Revision.send_email, sender=Revision)

В качестве альтернативы без использования этих декораторов вы можете передать метод ограниченного экземпляра:

class Revision(models.Model):
# Model junk...

    def send_email(self, sender, instance, created, **kwargs):
        if created:
            print "DO STUFF"

signals.post_save.connect(Revision().send_email, sender=Revision)

Ссылки:

  • Из исходного кода Django :

    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):
        """
        Connect receiver to sender for signal.
    
        Arguments:
    
            receiver
                A function or an instance method which is to receive signals.
                Receivers must be hashable objects.
    
                If weak is True, then receiver must be weak-referencable (more
                precisely saferef.safeRef() must be able to create a reference
                to the receiver).
    
                Receivers must be able to accept keyword arguments.
    
                If receivers have a dispatch_uid attribute, the receiver will
                not be added if another receiver already exists with that
                dispatch_uid.
    
  • Разница между @classmethod и @staticmethod: В чем разница между @staticmethod и @classmethod в Python?