从非抽象模型继承而没有多表继承

时间:2014-07-26 02:17:05

标签: python django multi-table-inheritance

如果模型不是abstract,是否有办法从现有模型继承以便复制其所有字段(以干燥的方式)而不调用多元继承?

要说清楚,我有一个模型Post,我想要另一个模型GhostPost完全根据可用字段来镜像Post,但是我希望它具有多重继承或与Post的任何关系。问题是,Post不是抽象模型,因此Django将启动多重继承。有办法解决这个问题吗?

更新:我在这里寻找的不是模型的Python级副本,而是一个反映这些字段的实际单独的数据库表。

解决方案:我按照@ Brandon的建议使用抽象模型。

2 个答案:

答案 0 :(得分:2)

在这种情况下,您需要使用代理模型。它将允许您扩展非抽象但没有多表继承的模型:https://docs.djangoproject.com/en/1.6/topics/db/models/#proxy-models

代理模型将保留单表,因此如果每个模型需要一个表,我建议为PostGhostPost模型创建一个公共抽象类来继承。 / p>

答案 1 :(得分:0)

您可以添加额外的BooleanField is_ghost,并覆盖原始模型和代理模型上的默认管理器:

class PostManager(models.Manager):
    def get_querset(self):
        return super(PostManager, self).get_queryset().filter(is_ghost=False)

class Post(models.Model):
    ...
    is_ghost = models.BooleanField(blank=True, default=False)
    objects = PostManager()

class GhostPostManager(models.Manager):
    def get_queryset(self):
        return super(GhostPostManager, self).get_queryset().filter(is_ghost=True)

class GhostPost(Post):
    objects = GhostPostManager()

    Meta:
        proxy = True

这会将所有内容保存在一个表中,但管理器和查询集的行为就像是两个独立的模型/表。

另一种解决方案是为两个模型使用抽象基类。如果您不更改原始Post模型的类名,则继承自例如AbstractPost,我不认为这会导致任何问题。