Django管理命令:提供没有循环引用的基类

时间:2013-09-25 12:34:19

标签: python django circular-reference

首先,它不是关于循环Model引用。我可以找到很多关于那些的答案。

我正在构建一个应用程序,让您可以在设置中轻松定义提醒。因此REMINDERS设置如下所示:

设置

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

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

students_app / 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())

reminders_app /管理/命令/ send_reminders.py

管理命令在reminder_class中使用handle导入此django.utils.module_loading.import_by_path - 字符串,但此操作失败并显示:

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

因为它成为循环引用。 如何为我的应用程序的用户提供可子类化的基类,而不会遇到此问题?

感谢。

1 个答案:

答案 0 :(得分:1)

此问题与Python 2中的默认导入顺序有关。如果您在students_app/reminders.py并且from reminders.base_reminders import ReminderEmail,则不清楚reminders模块是指自己还是{你的应用程序,也称为提醒。要解决这个问题,你可以在Python 2.5+中使用from __future__ import absolute_import(或者使用Python 3,这是默认值)

from __future__ import absolute_import
from reminders.base_reminders import ReminderEmail

这将确保reminders导入使用reminders应用而非相对reminders模块。

另一个修补程序是一个文档,它不会鼓励人们命名他们的模块reminders以避免这种命名冲突。