Django - 信号.简单的例子开始

Viv*_*han 23 python django django-signals

我是Django的新手,我无法理解如何使用Django信号.任何人都可以用简单的例子解释" Django信号 "吗?

提前致谢.

Pra*_*aur 33

通过非常小的研究,您可以在互联网上找到关于django信号的非常好的内容.

在这里,我将向您简要介绍Django信号.
什么是Django信号?
信号允许某些发送者通知一组接收者某些动作已经发生

行动:

调用model的save()方法.
django.db.models.signals.pre_save | post_save

调用model的delete()方法.
django.db.models.signals.pre_delete | post_delete

模型上的ManyToManyField已更改.
django.db.models.signals.m2m_changed

Django启动或完成HTTP请求.
django.core.signals.request_started | request_finished

所有信号都是django.dispatch.Signal实例.

非常基本的例子:

models.py

from django.db import models
from django.db.models import signals

def create_customer(sender, instance, created, **kwargs):
    print "Save is called"

class Customer(models.Model):
    name = models.CharField(max_length=16)
    description = models.CharField(max_length=32)

signals.post_save.connect(receiver=create_customer, sender=Customer)
Run Code Online (Sandbox Code Playgroud)

贝壳

In [1]: obj = Customer(name='foo', description='foo in detail')

In [2]: obj.save()
Save is called
Run Code Online (Sandbox Code Playgroud)


Man*_*hit 15

除了Prashant给出的解释之外,您还可以使用模块中的接收器装饰器django.dispatch.

例如

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

class Customer(models.Model):
    name = models.CharField(max_length=16)
    description = models.CharField(max_length=32)

@receiver(signals.pre_save, sender=Customer)
def create_customer(sender, instance, created, **kwargs):
    print "customer created"
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅此链接.

  • 这两个是两个不同的信号,在db中的模型持久性期间在不同阶段发出.post_save是在保存模型之后,pre_save是在保存模型之前. (2认同)