Excel不相邻列如何打印在一起-英雄云拓展知识分享
125
2023-11-07
【摘要】 本书摘自《Python+3自动化软件发布系统》一书中第4章,第4节,由陈刚、王洪军编著。
4.4 Django Models的抽象基类
在进行正式的系统数据库设计之前,还有一个操作要完成,这就是利用 Model 的继承来进行更有效率的开发。
Model 抽象类
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~