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 уже должен быть создан в начальной миграции.

Однако важно отметить, что реализация абстрактной базы и конкретной модели с отношениями к ней кажется невозможной из-за этих ограничений.

Вернуться на верх