微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

创建模型对象时不会触发 Django 信号

如何解决创建模型对象时不会触发 Django 信号

我正在使用 Django 信号触发任务(使用 django celery 包向订阅者发送大量电子邮件),当管理员发布博客文章时,由 Django 管理员创建。但是没有触发信号。我在不打印的信号中有一个打印语句,即在创建新博客后未收到信号。

我的应用是这样设置的。

enter image description here

我的博客模型:

class BlogPost(models.Model):

    author = models.CharField(max_length=64,default='Admin')    
    image = models.ImageField(blank=True,null=True)
    title = models.CharField(max_length=255)
    .................../

我的任务文件

from django.core.mail import send_mail

from travel_crm.settings import EMAIL_HOST_USER

    @shared_task
    def send_mails(self,*args,**kwargs):
    
        subscribers = self.kwargs['subscribers']
        blog = self.kwargs['blog']
        for abc in subscribers:
            emailad = abc.email
            send_mail('New Blog Post ',f" Checkout our new blog with title {blog.title} ",EMAIL_HOST_USER,[emailad],fail_silently=False)

我的signals.py文件

from .tasks import send_mails
from apps.blogs.models import BlogPost,Subscribers
from django.db.models.signals import post_save
from django.dispatch import receiver


    @receiver(post_save,sender=BlogPost)
    def email_task(sender,instance,created,**kwargs):
        print(123456789)
        if created:
            print(123456789)
            subscribers = Subscribers.objects.all()
            blog = BlogPost.objects.latest('date_created')
            print(blog)
            # task = send_mails(subscribers,blog)
            # task.delay()
            send_mails.delay(subscribers,blog)

我的初始化文件

from __future__ import absolute_import,unicode_literals
from apps.blogs.celery_files.celery import app as celery_app
__all__ = ('celery_app',)

解决方法

您必须在某处导入您的 signals.py 才能注册,django 文档建议在应用程序的 ready() 文件内的 apps.py 方法中导入它,如下所示:

from django.apps import AppConfig


class BlogsConfig(AppConfig):
    name = 'blogs'

    def ready(self):
        import blogs.celery_files.signals

https://docs.djangoproject.com/en/3.2/topics/signals/#connecting-receiver-functions

,

检查您的我的任务文件文件。您是否共享了整个文件?

你写道:

from django.core.mail import send_mail

from travel_crm.settings import EMAIL_HOST_USER

    @shared_task
    def send_mails(self,*args,**kwargs):
    
        subscribers = self.kwargs['subscribers']
        blog = self.kwargs['blog']
        for abc in subscribers:
            emailad = abc.email
            send_mail('New Blog Post ',f" Checkout our new blog with title {blog.title} ",EMAIL_HOST_USER,[emailad],fail_silently=False)

如果这是整个文件,则您有多个问题需要修复:

  1. 在没有相应导入的情况下使用 @shared_task 装饰器 from celery import shared_task
  2. 错误的意图 - 没有理由预期该功能
  3. 在类外使用 self 参数

您在signals.py 中有同样的意图问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。