model的继承是和普通的python类继承相似的,只是最初的基类是应该从models.Model中派生出来
种类
1 如果父类的是子类的共有信息 同时该父类不会被直接使用的情况 可以使用abstract 这样就不会产生一个表 也没有manager 也不能直接被实例化
继承时如果想继承Meta则需要显示说明(默认情况:继承abstract model的新model是会自动变为非abstract的model,即会自动设置abstract=False)或是不定义自己的Meta则使用的是父类的Meta
2 直接继承model的情况(父类非abstract情况)
这样在子类的表中也有相应的字段 同时会自动产生一个 one to one字段连接到父类 (parent link = True),可以使用自定义的OneToOneField然后增加parent_link=True在这个字段上。
对于Meta还是不会继承 特殊情况,如果子类没有定义ordering、get_latest_by属性则会使用父类的值。
3 如果只是想在python层面上改变行为而不涉及model可以使用Proxy
这种情况下只是想改变一下manager或加一个新的方法
通过在Meta中定义proxy=True
或者设置不同的ordering即可获得不同排序效果的但是相同表的model
多继承
使用时以第一个出现的父类的字段为准
如果都有id字段会错误
一般的python中的继承,子类可以重载父类的属性,但是对于model则只能重载abstract model的字段。
网友评论