Django管理命令:提供不带循环引用的基类

2024-10-05 14:23:15 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,它不是关于循环Model引用。我能找到很多关于这些的答案。你知道吗

我正在建立一个应用程序,让你很容易地定义提醒你的设置。因此REMINDERS设置如下所示:

设置

REMINDERS = [
    {
        'reminder_id': 'my-id',
        'reminder_class': 'students.reminders.ExpiredAvailabilityEmailReminder',
    },
]

在这个应用程序(reminders)中,我为这些提醒提供了一个基类,其中包含一些默认行为。要定义提醒,我唯一要做的就是:

学生应用程序/提醒.py你知道吗

from reminders.base_reminders import ReminderEmail
from .models import Student


class ExpiredAvailabilityEmailReminder(ReminderEmail):
    template_name = 'students/emails/setting_expired.html'

    def get_queryset(self):
        return Student.objects.filter(
                    is_active=True,
                    setting_expired__lt=datetime.date.today())

提醒应用程序/管理/命令/发送_提醒.py你知道吗

management命令使用django.utils.module_loading.import_by_pathhandle中导入此reminder_class-字符串,但失败的原因是:

django.core.exceptions.ImproperlyConfigured: Error importing module studenten.reminders: "No module named base_reminders"

因为它变成了一个循环引用。如何为我的应用程序的用户提供一个子类基类,而不会遇到这个问题?

谢谢。你知道吗


Tags: frompyimportid应用程序base定义基类
1条回答
网友
1楼 · 发布于 2024-10-05 14:23:15

这个问题与python2中的默认导入顺序有关。如果您在students_app/reminders.py中,并且您有from reminders.base_reminders import ReminderEmail,则不清楚reminders模块是指自身还是指您的应用程序(也称为提醒)。要解决这个问题,可以在python2.5+中使用from __future__ import absolute_import(或者在默认情况下使用python3)

from __future__ import absolute_import
from reminders.base_reminders import ReminderEmail

这将确保reminders导入使用reminders应用程序,而不是相对的reminders模块。你知道吗

另一个修正是一个文档,它不鼓励人们命名他们的模块reminders,以避免这种命名冲突。你知道吗

相关问题 更多 >