如果模型不是abstract
,是否有一种方法可以从现有模型继承以复制其所有字段(以DRY方式)而不调用多表继承?
要明确,我有一个模型Post
,我想有另一个模型GhostPost
,在可用字段方面完全镜像Post
,但我做不是希望它具有多表继承或与Post
的任何类型的关系。问题是,Post
不是一个抽象模型,所以Django会启动多表继承。有办法解决这个问题吗?
Update:我在这里寻找的不是模型的python级副本,而是镜像这些字段的实际独立数据库表。
解决方案:我遵循了@Brandon的建议,使用了一个抽象模型
在这种情况下您需要使用代理模型。它将允许您扩展一个不是抽象的但没有多表继承的模型:https://docs.djangoproject.com/en/1.6/topics/db/models/#proxy-models
代理模型将保留单个表,因此如果每个模型需要一个表,我建议创建一个公共抽象类来继承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
这将保持所有的东西在一个表中,但是管理器和查询集将表现得像它们是两个独立的模型/表。
另一个解决方案是为两个模型使用一个抽象基类。如果您不更改原始Post
模型的类名,并从例如AbstractPost
继承,我认为这应该不会造成任何问题。