将对象与 Meta 和 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包含 django Meta类,Meta类也会在SomeDjangoModels中可用吗? 如果是,有没有办法证明它(元类确实存在)?

感谢

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

元继承

创建抽象基类时,Django 会将您在基类中声明的任何 Meta 内部类作为属性提供。如果子类没有声明自己的 Meta 类,它将继承父类的 Meta。如果子级想要扩展父级的元类,它可以对其进行子类化。

但在您的情况下,它不执行任何操作,因为继承子类上的 absrtact 设置为 False。

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

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

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

默认情况下,子类将继承其父类的Meta,但它不会继承 abstract=True 属性(因为常见的用例是子类不会是抽象的)。

如果您确实希望继承它,则必须显式重写元类,如文档所示。 (从问题看来,你确实希望SomeDjangoModels也是抽象的,但并不完全清楚。

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

最新更新