【问题标题】:Django duplicate model definition/fieldsDjango重复模型定义/字段
【发布时间】:2012-10-22 19:02:57
【问题描述】:

这是我使用的:

class a(models.Model):
    x = models.CharField()

class b(a):
    pass

这样做的问题是,当创建 b 的实例时,也创建了 a 的实例,我猜这是因为 b 继承了 Django 分配的某些属性,例如数据库表。我想让 b 拥有所有的字段和方法,这样就不会发生这种重复。如何做到这一点不简单地将所有代码从 a 复制并粘贴到 b 或使用抽象基类 c 并且 a 和 b 都从 c 继承(我只想有两个模型/类)? 你必须使用元类吗?

【问题讨论】:

    标签: python django model-view-controller metaclass


    【解决方案1】:
    class A(models.Model):
        #some fields here
        x = models.CharField()
        class Meta:
            abstract = True
    
    class B(A):
        pass
    

    A 将是一个抽象类,你不能单独使用这个类。但据我了解,您希望有两个真正的课程AB。在这种情况下,您需要第三个(抽象)类C。因此,他们将从抽象字段中继承字段并为其添加额外字段。

    例如: 假设摘要是 C

    class C(models.Model):
        # the common fields 
        class Meta:
            abstract = True
    class A(C):
        #extra fields if you need or pass
    class B(C):
         #extra fields if you need or pass
    

    【讨论】:

      【解决方案2】:

      a 设为abstract model

      class a(models.Model):
          class Meta:
              abstract = True
          x = models.CharField()
      

      还要注意类名要大写,所以应该是AB,但是x是正确的。

      【讨论】:

      • 这不会导致无法创建 a 的实例吗?虽然显然解决方案是创建第三个类作为抽象基类并从它继承 a 和 b,但有没有办法只用两个类/模型来做到这一点?对不起,我没有说清楚,我会更新问题
      猜你喜欢
      • 2012-01-06
      • 1970-01-01
      • 2012-08-08
      • 2014-09-04
      • 1970-01-01
      • 2012-12-11
      • 2016-10-10
      • 2015-04-16
      • 2022-01-24
      相关资源
      最近更新 更多