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



如果模型不是abstract,是否有一种方法可以从现有模型继承以复制其所有字段(以DRY方式)而不调用多表继承?

要明确,我有一个模型Post,我想有另一个模型GhostPost,在可用字段方面完全镜像Post,但我做不是希望它具有多表继承或与Post的任何类型的关系。问题是,Post不是一个抽象模型,所以Django会启动多表继承。有办法解决这个问题吗?

Update:我在这里寻找的不是模型的python级副本,而是镜像这些字段的实际独立数据库表。

解决方案:我遵循了@Brandon的建议,使用了一个抽象模型

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

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

您可以添加一个额外的布尔域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继承,我认为这应该不会造成任何问题。

相关内容

  • 没有找到相关文章

最新更新