Django 可安装应用程序。依赖于其实现的抽象类

问题描述 投票:0回答:1

在我的可安装 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 类抽象化并强制用户实现它,从而解决了问题。不过我想知道是否还有其他方法可以解决。

python django django-models django-orm django-migrations
1个回答
0
投票

总之,选择抽象类似乎是最适合我当前情况的方法。

或者,通过在

Timer
模型中将结果存储为 JSON 来考虑非规范化,这也是一种可行的解决方案。

我也尝试过使用

swappable_dependency
,但它不起作用,因为
Timer
应该已经在初始迁移中创建。

但是,值得注意的是,由于这些限制,实现抽象基础和与之相关的具体模型似乎是不可能的。

© www.soinside.com 2019 - 2024. All rights reserved.