django 信号发送和自定义信号处理

框架使用

from django.dispatch import Signal, receiver

    # init
    order_done = Signal(providing_args=["order_id", "type"])


    # receiver
    @receiver(order_done)
    def order_done_receiver(sender, **kwargs):
        print('order done with order_id: {} and type: {}'.format(kwargs["order_id"],kwargs["type"]))


    # send
    order_done.send(sender=None, order_id=int(time.time()), type="card")

自定义信号

 from django.dispatch import Signal, receiver

    # init
    order_done = Signal(providing_args=["order_id", "type"])


    # receiver
    def order_done_receiver(sender, **kwargs):
        print('order done with order_id: {} and type: {}'.format(kwargs["order_id"],kwargs["type"]))

    # register
    order_done.connect(order_done_receiver)

    # send
    order_done.send(sender=None, order_id=int(time.time()), type="card")

信号的前置 后置操作

from django.db import models

    class Warehouse(models.Model):
        name = models.CharField(max_length=255)
        total_products = models.PositiveIntegerField(default=0)

        def __str__(self):
            return self.name


    class Product(models.Model):
        name = models.CharField(max_length=255)
        quantity = models.PositiveIntegerField(default=0)
        warehouse = models.ForeignKey(Warehouse, on_delete=models.CASCADE, related_name="products")

        def __str__(self):
            return self.name


    from django.db.models.signals import pre_save, post_save
    from django.dispatch import receiver


    @receiver(pre_save, sender=Product)
    def update_total_products(sender, instance, **kwargs):
        if instance.pk:
            old_quantity = Product.objects.get(pk=instance.pk).quantity
            difference = instance.quantity - old_quantity
        else:
            difference = instance.quantity

        instance.warehouse.total_products += difference
        instance.warehouse.save()


    @receiver(post_save, sender=Product)
    def send_low_stock_notification(sender, instance, **kwargs):
        low_stock_threshold = 10
        if instance.quantity < low_stock_threshold:
            logger.warning('warehouse is full!')
posted @ 2025-05-21 11:22  vx_guanchaoguo0  阅读(9)  评论(0)    收藏  举报