2

首先,它与循环Model引用无关。我可以找到很多关于这些的答案。

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

设置

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

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

student_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())

提醒应用程序/管理/命令/发送提醒.py

管理命令将此reminder_class-string导入handlewith django.utils.module_loading.import_by_path,但失败并显示:

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

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

谢谢。

4

1 回答 1

1

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

from __future__ import absolute_import
from reminders.base_reminders import ReminderEmail

这将确保reminders导入使用reminders应用程序而不是相关reminders模块。

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

于 2013-09-25T13:47:55.757 回答