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