Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从非抽象模型继承,无需多表继承_Python_Django_Multi Table Inheritance - Fatal编程技术网

Python 从非抽象模型继承,无需多表继承

Python 从非抽象模型继承,无需多表继承,python,django,multi-table-inheritance,Python,Django,Multi Table Inheritance,如果模型不是抽象的,是否有一种方法可以从现有模型继承,以便复制其所有字段(以干式方式),而不调用多表继承 明确地说,我有一个模型Post,我想有另一个模型GhostPost,根据可用字段准确地镜像Post,但我不希望它具有多任务继承或与Post的任何关系。问题是,Post不是抽象模型,因此Django将启动多任务继承。有办法解决这个问题吗 更新:我在这里寻找的不是模型的Python级副本,而是一个实际的独立数据库表,它反映了这些字段 解决方案:我遵照@Brandon的建议,使用了一个抽象模型。在

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

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

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


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

在这种情况下,您需要使用代理模型。它将允许您扩展一个非抽象但没有多表继承的模型:


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

您可以添加一个额外的布尔字段
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
这将把所有内容都保存在一个表中,但是managers和queryset将表现为两个独立的模型/表


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

这里的问题是代理模型实际上是在同一个数据库表上运行的,我需要的是一个完全不同的表,只是具有相同的字段。明白了。制作一个普通的抽象类,由
Post
GhostPost
继承怎么样?我正在考虑,但考虑到我已经在
Post
上存储了大量数据,我有点害怕破坏一切。不过我可能会试一试。我希望有一种方法可以以抽象的方式从
Post
继承——我现在正在玩弄元类,在传入时将基类更改为抽象类。如果从普通抽象类重构,应该可以。这是我已经使用过很多次的策略。如果你编辑你的答案以包含公共抽象类(这很可能是我最终使用的),我将能够接受它。