Skip to main content
 首页 » 编程设计

python之Django 管理命令 : provide base class without circular reference

2025年05月04日39yjmyzz

首先,它与循环 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 以避免这种命名冲突。