有没有办法将创建的模型字段扩展到Django中的另一个模型?

时间:2019-04-30 06:21:56

标签: django django-models

说,我想创建两个模型,其中第二个模型的所有字段都将与第一个模型相同,并增加一些其他字段。有什么好的方法可以做到这一点吗?

一种方法是将抽象类用作第一个模型,但这将意味着我将无法添加第一个模型的实例。您可以在下面的代码中找到示例:

假设我们有两种模型:

class Model1(models.Model):
    m1field1 = models.CharField(max_length=255,required=True)
    m1field2 = models.CharField(...)
    m1field3 = models.CharField(...)
    ...
    m1field8 = models.CharField(...)
class Model2(models.Model):
    m1field1 = models.CharField(max_length=255,required=True)
    ...
    m1field8 = models.CharField(...)
    m2field1 = models.CharField(...)
    ...
    m2field5 = models.CharField(...)

如您所见,如果必须重用它,我必须在Model2中重新定义m1field1-m1field8。 有什么办法,不再重复。 我尝试了以下方法:

class Model2(Model1):

    m2field1 = models.CharField(...)
    ...
    m2field5 = models.CharField(...)

但是,这在事后并不起作用,而是将Model2的OneToOneField创建到Model1,这显然行不通,因为我必须首先使用给定的字段创建Model1,然后使用这些字段创建Model2,然后将其链接到Model1。

一个可能的解决方案是使用具有公共字段的抽象模型。但是还有其他方法可以达到相同的结果吗?

2 个答案:

答案 0 :(得分:0)

您可以尝试这样:

class ModelBase(models.Model):
    # declare a base abstract class 
    m1field1 = models.CharField(max_length=255,required=True)
    m1field2 = models.CharField(...)
    m1field3 = models.CharField(...)
    ...
    m1field8 = models.CharField(...)

    class Meta:
        abstract = True

class Model1(ModelBase):
     # subclass from abstract class 
     pass

class Model2(ModelBase):
    # subclass from abstract class 
    m2field1 = models.CharField(...)
    ...
    m2field5 = models.CharField(...)

答案 1 :(得分:0)

您可以像这样为常见字段创建混合。

class CommonFieldsMixin(models.Model):
    m1field1 = models.CharField(max_length=255,required=True)
    m1field2 = models.CharField(...)
    m1field3 = models.CharField(...)
    ...
    m1field8 = models.CharField(...)

    class Meta:
        abstract = True

在两个模型中都使用此混合。

class Model1(CommonFieldsMixin, models.Model):
    pass

class Model2(CommonFieldsMixin, models.Model):
    m2field1 = models.CharField(...)
    m2field5 = models.CharField(...)