ad

《Python+3自动化软件发布系统》Django 2实战_了解Python的更好方法_4.4 Django Models的抽象基类

网友投稿 125 2023-11-07

【摘要】 本书摘自《Python+3自动化软件发布系统》一书中第4章,第4节,由陈刚、王洪军编著。

4.4 Django Models的抽象基类

在进行正式的系统数据库设计之前,还有一个操作要完成,这就是利用 Model 的继承来进行更有效率的开发。

Model 抽象类

《Python+3自动化软件发布系统》Django 2实战_了解Python的更好方法_4.4 Django Models的抽象基类

Django 中的Model 继承与 Python 中的类继承非常相似,只不过要选择具体的 实现方式:是让父 Model 拥有独立的数据库,还是让父 Model 只包含基本的公共信 息,而这些信息只能由子 Model 呈现。

Django 中有三种继承关系:

① 通常,你只是想用父 Model 来保存那些不想在子 Model 中重复录入的信息 父类是不使用的,也就是不生成单独的数据表,这种情况下使用抽象基类继承 Ab-

stract base classes。

② 如果你想从现有的 Model 继承并让每个 Model 都有自己的数据表,那么使用多重表继承 Multi-table inheritance。

③ 如果你只想在 Model 中修改 Python-level 级的行为,而不涉及字段改变,那 么代理 Model(Proxy models) 适用于这种场合。

具体解释如下。

(1)Abstract base classes

如果你想把某些公共信息添加到很多 Model 中,抽象基类就显得非常有用。编 写完基类之后,在 Meta 内嵌类中设置abstract=True, 该类就不能创建任何数据表。 然而如果将它作为其他 Model 的基类,那么该类的字段就会被添加到子类中。抽象 基类和子类如果含有同名字段,就会导致错误(Django 将抛出异常)。

(2)M eta 继承

创建抽象基类的时候,Django 会将你在基类中所声明的有效的 Meta 内嵌类作 为一个属性。如果子类没有声明它自己的 Meta 内嵌类,它就会继承父类的 Meta。 子类的 Meta 也可以直接继承父类的 Meta 内嵌类,对其进行扩展。

(3)代理 Model(Proxy models)

当使用多表继承(multi-table inheritance)时 ,Model 的每个子类都会创建一张 新数据表,通常情况下,这正是我们想要的操作。这是因为子类需要一个空间来存储 不包含在基类中的字段数据。但有时,你可能只想更改 Model 在 Python 层的行为 实现,比如:更改默认的 Manager, 或是添加一个新方法。

而这正是代理 Model 继承方式要做的:为原始 Model 创建一个代理(proxy) 。 你可以创建、删除、更新代理 Model 的实例,而且所有的数据都可以像使用原始 Model 一样被保存。不同之处在于:你可以在代理 Model 中改变默认的排序设置和 默认的 Manager, 而不会对原始 Model 产生影响。

声明代理 Model 和声明普通 Model 没有什么不同。设置 Meta 内置类中 Proxy 的值为 True, 就完成了对代理 Model 的声明。

而这里要使用的,就是抽象基类(Abstract base classes)。

在 Public 目录下,新建一个 models.py 文件,然后在文件中输入以下内容:

https://github.com/aguncn/manabe/blob/master/manabe/public/models.py

这个类的目的,就是将以后每个表都会用到的公共字段提取出来,如名称 (name) 、描述(description) 、 更新日期(change_date) 、 创建日期(add_date) 、 状态 (status) 等,并且默认显示的字段为名称。这样一来,后面的数据表只要继承自这个 基类,就会自动拥有这个字段了,这在避免了不一致命名的同时,加快了开发速度。 abstract =True 这一行,表明了这个类为基类,不可以直接用来生成数据表。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《自己动手写 Python 虚拟机》_更理解虚拟机的意义_2.1 Python字节码
下一篇:《Excel VBA+SQL数据管理与应用模板开发》_工作效率UP!_3.2.9 利用合计函数
相关文章

 发表评论

暂时没有评论,来抢沙发吧~