Django模型类继承 - 默认字段与覆盖

0 投票
2 回答
3503 浏览
提问于 2025-04-16 11:49

我想要创建一个继承类的模板,这样我的所有模型都能有一些默认的字段,并且都有一些函数的默认重写,比如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,这样基类的所有字段就会被添加到子类的表里。文档里解释得比我说得更清楚。

我经常发现自己开始用一种方式做,然后在思考数据库结构时反复切换几次……

撰写回答