在django模型中发送和接收信号

Hom*_*lli 8 python django django-signals

我使用的是django 2.0.8和Python 3.5.我希望能够在将对象保存到数据库时发送和接收自定义信号.

我已经关注了Django关于收听信号的文档以及与Django捆绑在一起核心信号 - 但是,我无法让我的示例工作.

这是我到目前为止:

的myapp/models.py

from django.db import models
import django.dispatch

my_signal = django.dispatch.Signal(providing_args=["name"])

class Foo(models.Model):
    name = models.CharField(max_length=16)

def save(self, *args, **kwargs):
    try:
        # Call the "real" save() method.
        super().save(*args, **kwargs)  

        # Fire off signal         
        my_signal.send(sender=self.__class__, name=self.name)

    except Exception as e:
        print ('Exception:', e)
        #pass
Run Code Online (Sandbox Code Playgroud)

MYAPP/signals.py

from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Foo


@receiver(post_save, sender=Foo)
def foo_handler(sender, **kwargs):
    print('Foo Signal Recieved!')
    print(kwargs)
Run Code Online (Sandbox Code Playgroud)

MYAPP/app.py

class MyappConfig(AppConfig):
    name = 'myapp'
    label = 'myapp'

    def ready(self):
        import myapp.signals
Run Code Online (Sandbox Code Playgroud)

样品用法

from myapp.models import Foo

foo = Foo(name='Homer Simpson')
foo.save() # Object is saved, but event is not fired!
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么信号没有被解雇?

new*_*ife 7

看来你需要Django提供的两个功能.信号和内容类型.

所以先阅读文档

模型Activitycontenttypes相关,似乎你错过了object_id字段,它指示哪个模型实例是crud.

对于每个crud操作,都在创建一个Activity实例.这部分只是用signal.py编写的代码

信号:信号必须连接每个具体模型.幸运的是,请参阅装饰器接收器的源代码.

我们有一个信号列表[post_save,post_delete]和一个模型列表(FoodooChile,FooBarChile)来连接.

在post_save中,创建的参数表示操作是创建或更新.

最后,通常我们在urls.py中导入信号文件,这可能不是最好的做法.


它也与你有关settings.py.使用'myapp.apps.MyappConfig'替代myappsettings.py,定义default_app_config = 'myapp.apps.MyappConfig'myapp/__init__.py.评论中的上述链接详细描述了这一点