首先,它与循环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())


hinters_app / management / commands / send_reminders.py

管理命令使用reminder_classhandle中导入此django.utils.module_loading.import_by_path字符串,但是失败,并显示:

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


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

谢谢。

最佳答案

此问题与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以避免这种命名冲突。

10-01 02:34