我试图创建一个可重用的应用程序,在其中定义一些抽象模型,以及如果用户不想自己继承模型,可以使用的那些模型的某些具体版本。如果用户想要要创建自己的子类,那么我不希望Django创建这些具体模型。
这是我目前的解决方案:
myapp / abstract.py
class AbstractModel1:
class Meta:
abstract = True
field1 = models.CharField(max_length=255)
class AbstractModel2:
class Meta:
abstract = True
field1 = models.CharField(max_length=255)
field2 = models.ForeignKey(getattr(settings, 'ABSTRACTMODEL1_OVERRIDE', 'myapp.ConcreteModel1'))
myapp / models.py
if not hasattr(settings, 'ABSTRACTMODEL1_OVERRIDE'):
class ConcreteModel1(AbstractModel1):
pass
if not hasattr(settings, 'ABSTRACTMODEL2_OVERRIDE'):
class ConcreteModel2(AbstractModel2):
pass
然后,在用户的应用程序中,他们可以使用所提供的具体模型,或者如果不使用,则可以创建自己的模型子类,如下所示:
userapp / models.py
class CustomModel1(AbstractModel1):
extrafield1 = models.CharField(max_length=255)
userapp / settings.py
ABSTRACTMODEL1_OVERRIDE = "userapp.CustomModel1"
这是实现这一目标的最佳方法吗?在尝试迁移子类模型中的更改时,我是否会遇到困难?如果用户要先使用提供的具体类然后迁移到自定义类,该怎么办?