在我的可安装 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 类抽象化并强制用户实现它,从而解决了问题。不过我想知道是否还有其他方法可以解决。
总之,选择抽象类似乎是最适合我当前情况的方法。
或者,通过在
Timer
模型中将结果存储为 JSON 来考虑非规范化,这也是一种可行的解决方案。
我也尝试过使用
swappable_dependency
,但它不起作用,因为 Timer
应该已经在初始迁移中创建。
但是,值得注意的是,由于这些限制,实现抽象基础和与之相关的具体模型似乎是不可能的。