首先,它与循环 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/management/commands/send_reminders.py
管理命令使用 django.utils.module_loading.import_by_path 在 handle 中导入此 reminder_class-string,但这失败了:
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 以避免这种命名冲突。
