Django Installable App. Абстрактный класс с зависимостями от его реализации
В моем устанавливаемом приложении Django есть класс Timer, который я планирую реализовать для пользователей:
class Timer(models.Model):
class Meta:
abstract = True
project = models.ForeignKey(settings.PROJECT_MODEL)
user = models.ForeignKey(settings.AUTH_USER_MODEL)
@abstractmethod
def finish(self):
raise NotImplementedError
Дополнительно у меня есть класс для записи результатов:
class TimerResults(models.Model):
timer1 = models.ForeignKey(settings.TIMER_MODEL)
parameter1 = models.IntegerField()
parameter2 = models.IntegerField()
parameter3 = models.IntegerField()
По моему замыслу, пользователи должны создавать свои собственные Timer
, реализовывать метод finish
, который затем должен создавать TimerResults
. Однако этот подход работает не так, как предполагалось. Когда я реализую Timer
в другом приложении, django пытается автообнаружить другие модели, и в итоге находит TimerResults
, у которой есть внешний ключ, ссылающийся на settings.TIMER_MODEL
. Однако модель TIMER_MODEL еще не создана, что приводит к следующему сообщению об ошибке:
"Поле installable_app.TimerResults.timer было объявлено с ленивой ссылкой на 'app.timer', но приложение 'app' не предоставляет модель 'timer'"
Я нашел решение, как сделать класс TimerResults абстрактным и заставить пользователя реализовать его, что решает проблему. Однако мне интересно, есть ли другие способы решения этой проблемы.
В заключение, выбор абстрактного класса представляется наиболее подходящим подходом для моей текущей ситуации.
Альтернативный вариант - рассмотрение денормализации путем хранения результатов в виде JSON в рамках модели Timer
- представляется жизнеспособным решением.
Я также пробовал использовать swappable_dependency
, но это не сработало, потому что Timer
уже должен быть создан в начальной миграции.
Однако важно отметить, что реализация абстрактной базы и конкретной модели с отношениями к ней кажется невозможной из-за этих ограничений.