繁体   English   中英

如何避免在Django中进行依赖注入?

[英]How to avoid dependency injection in Django?

我试图弄清楚如何避免在项目中注入依赖项。 应用程序目录中有一个文件notifications.py

文件notifications.py包含用于向管理员和用户发送电子邮件的方法。 要获取管理员电子邮件,我需要检查SystemData模型的对象。 但是在模型中,我使用通知。

楷模

class SystemData(models.Model):
    admin_alerts_email = models.EmailField(verbose_name=u'Emailová adresa admina')
    contact_us_email = models.EmailField(verbose_name=u'Adresa kontaktujte nás')
    waiting_threshold = models.PositiveSmallIntegerField(verbose_name=u'Maximálny počet minút čakania')

class SomeModel(models.Model):
    ....
    def save(...):
        notifications.send_message_to_admin('message')

notifications.py

from django.core.mail import EmailMessage
from models import SystemData

def send_message_to_admin(message):
    mail = EmailMessage(subject, message, to=[SystemData.objects.all().first().admin_email])
    mail.send()

Django返回无法导入SystemData

你知道该怎么办吗?

编辑:

stacktrace

堆栈跟踪

您可以使用内联导入来解决函数中的循环依赖关系:

class SomeModel(models.Model):
    ....
    def save(...):
        from .notifications import send_message_to_admin
        send_message_to_admin('message')

这将延迟import语句,直到该函数实际执行为止,因此已经加载了models模块。 然后, notifications模块可以安全地导入models模块。

除了使用循环导入之外,您还可以这样做:

from django.core.mail import EmailMessage
from django.db.models.signals import post_save
from django.dispatch import receiver

from .models import SystemData, SomeModel


@receiver(post_save, sender=SomeModel)
def send_message_to_admin(sender, instance, created, **kwargs):
    message = 'message'
    mail = EmailMessage(
        subject, 
        message, 
        to=[SystemData.objects.all().first().admin_email]
    )
    mail.send()

并在models.py的末尾

from .notifications import *

或将最新方法与AppConfig一起使用来注册信号(这实际上是您的通知所做的事情)

参见: https : //chriskief.com/2014/02/28/django-1-7-signals-appconfig/

这样,它将在应用程序注册表准备就绪时加载,并且您将避免循环导入,因此该行:

from .notifications import *

可以从models.py中删除

AppConfig可以以更通用的方式使用,也可以导入以下模型:

from django.apps import apps
Model = apps.get_model('app_name', 'Model')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM