如果模型不是abstract
,是否有办法从现有模型继承以便复制其所有字段(以干燥的方式)而不调用多元继承?
要说清楚,我有一个模型Post
,我想要另一个模型GhostPost
完全根据可用字段来镜像Post
,但是我不希望它具有多重继承或与Post
的任何关系。问题是,Post
不是抽象模型,因此Django将启动多重继承。有办法解决这个问题吗?
更新:我在这里寻找的不是模型的Python级副本,而是一个反映这些字段的实际单独的数据库表。
解决方案:我按照@ Brandon的建议使用抽象模型。
答案 0 :(得分:2)
在这种情况下,您需要使用代理模型。它将允许您扩展非抽象但没有多表继承的模型:https://docs.djangoproject.com/en/1.6/topics/db/models/#proxy-models
代理模型将保留单表,因此如果每个模型需要一个表,我建议为Post
和GhostPost
模型创建一个公共抽象类来继承。 / 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
,我不认为这会导致任何问题。