首先,它与循环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_class
在handle
中导入此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
以避免这种命名冲突。