Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在django中是否有一些方法可以将创建的模型字段扩展到另一个模型?_Django_Django Models - Fatal编程技术网

在django中是否有一些方法可以将创建的模型字段扩展到另一个模型?

在django中是否有一些方法可以将创建的模型字段扩展到另一个模型?,django,django-models,Django,Django Models,比如说,我想创建两个模型,其中第二个模型的所有字段将与第一个模型保持相同,并添加几个字段。有没有一个好的方法来实现这一点 一种方法是使用抽象类作为第一个模型,但这将意味着我无法添加第一个模型的实例。您可以在下面的代码中找到示例: 假设我们有两个模型: class Model1(models.Model): m1field1 = models.CharField(max_length=255,required=True) m1field2 = models.CharField(..

比如说,我想创建两个模型,其中第二个模型的所有字段将与第一个模型保持相同,并添加几个字段。有没有一个好的方法来实现这一点

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

假设我们有两个模型:

class Model1(models.Model):
    m1field1 = models.CharField(max_length=255,required=True)
    m1field2 = models.CharField(...)
    m1field3 = models.CharField(...)
    ...
    m1field8 = models.CharField(...)
如您所见,如果必须重用它,我必须在Model2中重新定义m1field1-m1field8。 有没有办法,不再重复。 我尝试了以下方法:

class Model2(Model1):

    m2field1 = models.CharField(...)
    ...
    m2field5 = models.CharField(...)
但是,事后看来,这并没有起到作用,它创建了一个Model2到Model1的OneToOneField,这显然不起作用,因为我必须首先创建一个包含给定字段的Model1,然后创建包含字段的Model2,然后将其链接到Model1

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

您可以这样尝试:

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(...)

您可以像这样为公共字段创建mixin

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(...)

试过这个。获取错误。您正试图将不可为空的字段“modelbase_ptr”添加到模型中,并要求提供默认值。但是,对于基础模型来说,这个问题不应该出现,对吗?
class Model1(CommonFieldsMixin, models.Model):
    pass

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