我如何可以使用Django信号调用模型方法? [英] How can I have a Django signal call a model method?

查看:222
本文介绍了我如何可以使用Django信号调用模型方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

也许只是迟了,但我不知道为什么这不工作。当我有一个post_save信号调用泛型函数时,它有效,但是当我有一个post_save信号调用一个模型的方法时,没有任何反应。这里是代码:

  class Revision(models.Model):
#模型垃圾...

def send_email(发件人,实例,创建,** kwargs):
如果创建:
打印DO STUFF

signals.post_save.connect send_email,sender = Revision)

但这不行:

  class Revision(models.Model):
#模型垃圾...

def send_email(发件人,实例,创建, ** kwargs):
如果创建:
打印DO STUFF

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

有没有一个善良的灵魂会阻止我把我的头砸到墙上?谢谢。

解决方案

在我看来,第二个问题是您正在使用无限制的方法 send_mail 。如果您真的想从类中调用 send_mail ,可能 @classmethod @staticmethod 将帮助您:

  class Revision(models.Model):
#模型垃圾...

@classmethod
def send_email(cls,sender,instance,creating,** kwargs )
如果创建:
打印DO STUFF

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

 类修订版(models.Model )
#模型垃圾...

@staticmethod
def send_email(发件人,实例,创建,** kwargs):
如果创建:
打印DO STUFF

signals.post_save.connect(Revision.send_email,sender = Revis离开)

或者不使用这些装饰器,您可以传递有界实例方法:

 类修订(models.Model):
#模型垃圾...

def send_email(self,发件人,实例,创建,** kwargs):
如果创建:
打印DO STUFF

signals.post_save.connect(版本()。send_email,sender =修订版)






参考文献:


  1. 从Django 源代码

      def connect(self,receiver,sender = None ,weak = True,dispatch_uid = None):

    将接收器连接到发送者的信号。

    参数:

    receiver
    要接收信号的函数或实例方法。
    接收器必须是可散置的对象。

    如果weak为True,则接收器必须是弱可引用的(更多
    精确的saferef.safeRef()必须能够为接收器创建引用
    )。

    接收者必须能够接受关键字参数。

    如果接收者有一个dispatch_uid属性,如果另一个接收方已经存在
    dispatch_uid,接收方将不会添加


  2. @classmethod @staticmethod Python中@staticmethod和@classmethod有什么区别?



Maybe it's just late, but I cannot figure out why this isn't working. When I have a post_save signal call a generic function, it works, but when I have a post_save signal call a method from a model, nothing happens. Here is code that works:

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)

But this does not work:

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)

Is there a kind soul out there who will keep me from smashing my head into the wall? Thanks.

解决方案

It seems to me that the problem in the second one is you are using an unbounded method send_mail. If you really want to call send_mail from within a class, maybe @classmethod or @staticmethod will help you out:

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)

or

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)

Alternatively without using these decorators, you can pass the bounded instance method:

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)


References:

  1. From the Django source code:

    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.
    

  2. Difference between @classmethod and @staticmethod: What is the difference between @staticmethod and @classmethod in Python?

这篇关于我如何可以使用Django信号调用模型方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆