说,我想创建两个模型,其中第二个模型的所有字段都将与第一个模型相同,并增加一些其他字段。有什么好的方法可以做到这一点吗?
一种方法是将抽象类用作第一个模型,但这将意味着我将无法添加第一个模型的实例。您可以在下面的代码中找到示例:
假设我们有两种模型:
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。
一个可能的解决方案是使用具有公共字段的抽象模型。但是还有其他方法可以达到相同的结果吗?
答案 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(...)