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

2024-09-30 00:28:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

明确地说,我有一个模型Post,我希望有另一个模型GhostPost,它完全按照可用字段镜像{},但我不希望它具有多个继承或与Post的任何类型的关系。问题是,Post不是一个抽象模型,因此Django将启动多任务继承。有办法吗?在

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

遵循了布兰迪的建议。在


Tags: django方法模型abstract类型镜像关系方式
2条回答

您可以添加一个额外的BooleanFieldis_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继承,我认为这不会引起任何问题。在

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

代理模型将保留一个表,因此如果每个模型需要一个表,我建议为Post和{}模型创建一个公共抽象类来继承。在

相关问题 更多 >

    热门问题