gpt4 book ai didi

python - 在 Django 模型中发送和接收信号

转载 作者:太空狗 更新时间:2023-10-29 21:00:08 24 4
gpt4 key购买 nike

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

我已经关注了关于 listening to signals 的 Django 文档还有 core signals bundled with 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

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)

我的应用程序/app.py
class MyappConfig(AppConfig):
name = 'myapp'
label = 'myapp'

def ready(self):
import myapp.signals

示例用法

from myapp.models import Foo

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

谁能解释为什么信号没有被触发?

最佳答案

看来您需要 Django 提供的两个功能。 signalcontenttypes .

所以先阅读文档

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

对于每一个crud action,都会创建一个Activity实例。这部分只是在signal.py

中编写的代码

信号:信号必须连接到每个具体模型。还好,看装饰器源码receiver .

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

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

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


它也和你的settings.py有关。使用'myapp.apps.MyappConfig'替换settings.py中的myapp定义default_app_config = myapp/__init__.py 中的“myapp.apps.MyappConfig”。上面评论中的链接对此进行了详细描述

关于python - 在 Django 模型中发送和接收信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52113566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com