2013-09-25 2 views
2

Прежде всего, речь идет не о круге Model ссылок. Я мог найти много ответов о них.Команда управления Django: предоставить базовый класс без круговой ссылки

Я создаю приложение, которое позволит вам легко определить напоминания в ваших настройках. Поэтому установка 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/Управление/Команды/send_reminders.py

импорта команды управления этим reminder_class -string в handle с django.utils.module_loading.import_by_path, но это не удается с:

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

Потому что он стал с круговой ссылкой. Как я могу предоставить пользователям моего приложения подклассы базового класса, не сталкиваясь с этой проблемой?

Спасибо.

+0

Почему это круговая ссылка? Вы импортируете базовый класс, если да, то почему? –

+0

Вы должны вызвать файл 'reminders.py'? – alecxe

ответ

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, чтобы избежать конфликта имен.

+0

Большое спасибо. Именование файла в 'students_app' на самом деле не является швом, чтобы иметь значение. Но 'absolute_import' отлично работает. – Tino

Смежные вопросы