在Django可重用应用中创建“可选”模型的最佳方法

时间:2018-08-13 14:18:00

标签: python django inheritance code-reuse

我试图创建一个可重用的应用程序,在其中定义一些抽象模型,以及如果用户不想自己继承模型,可以使用的那些模型的某些具体版本。如果用户想要要创建自己的子类,那么我不希望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"

这是实现这一目标的最佳方法吗?在尝试迁移子类模型中的更改时,我是否会遇到困难?如果用户要先使用提供的具体类然后迁移到自定义类,该怎么办?

0 个答案:

没有答案