将对象与Meta和django模型相结合。模型

时间:2015-01-07 04:32:32

标签: python django

这里有一些新手问题,我有一个这样的模型:

from django.db import models

class SomeCommons(object):
   # some fields here
   # ...
   class Meta:
      abstract=True

class SomeDjangoModels(SomeCommons,models.Model):
   pass

与以下型号相同:

from django.db import models

class SomeModels(models.Model):
   # some fields here
   # ...
   class Meta:
      abstract=True

据我所知,SomeDjangoModels(SomeCommons,models.Model) SomeCommons SomeDjangoModels中的SomeCommons属性将在Meta中提供,但如果Meta包含django,则问题为 SomeDjangoModels课程{{1}}课程也会在{{1}}中提供吗?如果是,有没有办法证明它(Meta类确实存在)?

感谢名单

2 个答案:

答案 0 :(得分:0)

是的,元类是继承的......

  

Meta inheritance

     

当创建抽象基类时,Django使您在基类中声明的任何Meta内部类可用作属性。如果子类没有声明它自己的Meta类,它将继承父类的Meta。如果孩子想要扩展父类的Meta类,它可以将其子类化。

但是在你的情况下它没有做任何事,因为继承子类的absrtact被设置为False。

  

Django确实对抽象基类的Meta类进行了一次调整:在安装Meta属性之前,它设置了abstract=False

结果SomeModels将是抽象的,但SomeDjangoModels不会。

答案 1 :(得分:-1)

不,这两个定义并不完全相同。

默认情况下为a subclass will inherit its parent's Meta,但会继承abstract=True属性(因为常见的用例是子类不是抽象的)。

如果您希望继承它,则必须显式覆盖元类,如文档中所示。 (问题似乎是你确实希望SomeDjangoModels也是抽象的,但它并不完全清楚。)

如果你想要一个具体的(cf meta)子类,那么出于所有实际目的,这些定义是相同的。