Django提供了抽象基类功能(它与Python中的ABC类不同?)因此可以创建一个可以继承的模型(Django的models.Model),但是没有该模型在数据库中有一个实际的表.一个通过在Model的Meta类中设置'abstract'属性来触发此行为.
现在的问题是:为什么Django会这样解决?为什么需要这种特殊的'抽象基类'模型?为什么不通过继承对象类并将其与现有模型混合来制作模型mixin?或者这也可以通过Python ABCs的任务?(请注意,我对Python中的ABC类不是很熟悉,我的无知可能会在这里显示)
Ara*_*yan 13
我会尝试相当简短,因为这很容易变成冗长的dia骂:
ABCs之所以外出是因为它们仅在Python 2.6中引入,而Django开发人员已经为Python版本支持制定了一套路线图(2.3支持仅在1.2中被删除).
对于继承对象的mixins,它们在更多方面不会像Pythonic那样降低可读性.Django使用ModelBase元类用于Model对象,实际上在初始化时分析定义的模型属性,并填充Model._meta字段,Meta选项和其他属性.为两种类型的模型重用该框架是有意义的.这也允许Django通过继承模型来防止抽象模型字段被覆盖.
我能想到的原因还有很多,所有这些都是他们自己的原因,但他们加起来使当前的实现更加Pythonic.然而,使用对象继承mixins并没有什么本质上的错误.
其中一个原因是因为在模型上定义字段的方式.
字段以声明方式指定,以普通类将其视为类属性的方式.然而,它们需要成为实际实例化类的实例属性,以便每个实例可以为每个字段拥有自己的值.这是通过元类管理的.这不适用于普通的抽象基类.
| 归档时间: |
|
| 查看次数: |
3916 次 |
| 最近记录: |