Django模型类继承 - 默认字段与覆盖
我想要创建一个继承类的模板,这样我的所有模型都能有一些默认的字段,并且都有一些函数的默认重写,比如save_model()。
如果我这样做,我能得到重写的功能,但就得手动设置一些元数据,比如db_table……
class ModelExtension(models.Model):
altered_by = models.CharField(max_length=64)
class SomeModel(ModelExtension):
class Meta:
db_table = 'app_somemodel'
fields = models.CharField()
...
有没有办法让这种继承正常工作?到目前为止,我要么得额外做一些工作来弥补这种方法的缺点,要么就会遇到MRO错误。
2 个回答
0
如果你只是想给一个模型添加新的功能,而不想改变它的字段,那就可以使用代理模型!
3
MRO错误是什么?你有没有看过Django文档关于模型继承的部分?你可以选择抽象基类、多表继承或者代理模型。
http://docs.djangoproject.com/en/stable/topics/db/models/#abstract-base-classes
你现在做的其实是多表继承——在你的两个模型之间有一个隐藏的OneToOneField连接着。我不明白你为什么觉得需要指定db_table,这个其实是不需要的。
如果你根本不打算创建ModelExtension这个类的对象,那你应该使用抽象基类。在这种情况下,你需要在Meta部分加上abstract=True,这样基类的所有字段就会被添加到子类的表里。文档里解释得比我说得更清楚。
我经常发现自己开始用一种方式做,然后在思考数据库结构时反复切换几次……