这里有一些新手问题,我有一个这样的模型:
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)子类,那么出于所有实际目的,定义是相同的。