1. ホーム
  2. django

[解決済み] Djangoプロジェクトでsignals.pyを保存する正しい場所とは?

2023-02-04 07:43:52

質問

私が読んでいた Django のドキュメントによると、どうやら signals.py を app フォルダに置くのが良いようです。しかし、私が直面している問題は、私が pre_save のシグナルを作成し、モデルからクラスをインポートしようとすると、それが import と衝突します。

# models.py

from django.contrib.auth.models import User
from django.db import models
from django.utils.translation import gettext as _
from signals import *

class Comm_Queue(CommunicatorAbstract):
    queue_statuses = (
        ('P', _('Pending')),
        ('S', _('Sent')),
        ('E', _('Error')),
        ('R', _('Rejected')),
    )
    status          = models.CharField(max_length=10, db_index=True, default='P')
    is_html         = models.BooleanField(default=False)
    language        = models.CharField(max_length=6, choices=settings.LANGUAGES)
    sender_email    = models.EmailField()
    recipient_email = models.EmailField()
    subject         = models.CharField(max_length=100)
    content         = models.TextField()


# signals.py

from django.conf import settings
from django.db.models.signals import pre_save
from django.dispatch import receiver
from models import Comm_Queue

@receiver(pre_save, sender=Comm_Queue)
def get_sender_email_from_settings(sender, **kwargs):
    obj=kwargs['instance']
    if not obj.sender_email:
        obj.sender_email='%s' % settings.ADMINS[0][1]

このコードが実行されないのは、インポートする Comm_Queue 内部 signals.py の中でシグナルをインポートし、さらに models.py .

どうすればこの問題を克服できるか、どなたかアドバイスをお願いします。

ご挨拶

どのように解決するのですか?

Django < 1.7用のオリジナルの回答です。

シグナルを登録するには、インポートする signals.py をアプリの __init__.py ファイルに記述します。

# __init__.py
import signals

これによって models.py から signals.py から、循環インポートエラーを起こさずに

この方法の1つの問題は、coverage.pyを使用している場合、カバレッジ結果を台無しにしてしまうことです。

関連する議論

編集:Django >= 1.7 の場合。

AppConfig が導入されて以来、シグナルをインポートする推奨方法は、その init() 関数を使用することです。参照 Eric Marcosの回答 をご覧ください。