class PhoneModelBase(model.Model):
phone = models.CharField(max_length=16)
...
class Meta:
abstract = True
class PhoneModel(PhoneModelBase):
# phone is here without typing it
# the only restriction is that you cannot redefine phone here
# its a Django restriction, not Python restriction
# phone = models.CharField(max_length=12) # <= This will raise exception
pass
我想你可能是在想遗产问题。继承实际上是组合模型的推荐方法。下面是如何在Django中正确使用模型继承的示例:
所以它创建了一个模型}。在
PhoneModelBase
,但是这里的关键是它使用class Meta
和{这里有更多的幕后活动,以及一些Python概念的解释。我想既然你在问题中提到了Java,你就不知道它们了。如果Python的解释真的很混乱的话,你也不可能完全理解这些概念。你只需要知道使用
abstact = True
。这是官方文件:https://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes。在Meta
中的Meta
属性就是一个属性。它与类中的任何其他属性相同,只是它是一个类实例(请记住,在Python中,类和函数是一阶成员)。另外,Python有一个称为__metaclass__
的东西,您可以将它添加到类中。__metaclass__
定义了如何构建类的实例的方法。更多关于here。Django在创建模型类实例时使用了这些方法。在因此,要创建
PhoneModelBase
类,下面是一个粗略的概述:PhoneModelBase
类的实例(类本身,而不是类-PhoneModelBase()
的实例)时,由于继承而来自model.Model
的{__metaclass__
中,Python调用创建实际类实例的函数,并将您尝试创建的类中的所有字段传递给它-PhoneModelBase。这将包括phone
、Meta
和您定义的任何其他字段Meta
属性,然后开始分析其属性。根据这些属性的值,Django将改变模型的行为abstract
属性,然后通过不将其存储在db中来更改它试图创建的类的逻辑PhoneModelBase
所以
PhoneModelBase
,尽管它的定义看起来非常类似于一个规则模型,但它不是一个规则模型。它只是一个抽象类,在其他模型中用作复合类。在当其他模型从
PhoneModelBase
继承时,它们的__metaclass__
将从基础模型复制属性,就像您手动键入这些属性一样。它不会是这样的外键。所有继承的属性都将成为模型的一部分,并且将位于同一个表中。在希望所有这些都有意义。如果不是,您只需记住将
Meta
类与abstract = True
一起使用。在编辑
正如注释中所建议的,您还可以从多个基类继承。因此,您可以拥有
PhoneModelBase
,DimensionsModelBase
,然后您可以从这两个(或更多)继承,所有基类的所有属性都将出现在模型中。在相关问题 更多 >
编程相关推荐