【问题标题】:Is there some way to extend the created model fields another model in django?有没有办法在 django 中扩展创建的模型字段另一个模型?
【发布时间】:2019-04-30 06:21:56
【问题描述】:

假设,我想创建两个模型,其中第二个模型的所有字段将与第一个模型保持相同,并添加更多字段。有什么好的方法可以实现吗?

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

假设我们有两个模型:

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 到 Model1 的 OneToOneField,这显然是行不通的,因为我必须先用给定的字段创建一个 Model1,然后用字段创建 Model2,然后链接它到模型 1。

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

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    您可以像这样为常用字段创建 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
    

    在两个模型中都使用这个 mixin。

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

    【讨论】:

      【解决方案2】:

      你可以这样试试:

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

      【讨论】:

      • 试过这个。得到错误。您正在尝试将不可为空的字段“modelbase_ptr”添加到模型中,并要求默认值。但是,对于基本模型,这个问题不应该出现,对吧?
      猜你喜欢
      • 2022-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      相关资源
      最近更新 更多