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
继承——我现在正在玩弄元类,在传入时将基类更改为抽象类。如果从普通抽象类重构,应该可以。这是我已经使用过很多次的策略。如果你编辑你的答案以包含公共抽象类(这很可能是我最终使用的),我将能够接受它。