如何在django中获取从同一父类继承的所有实例

时间:2010-01-06 05:55:18

标签: oop inheritance orm django-models

我有两个模型,而不是从同一个抽象基类继承。

我希望能够从类基类的子类中获取所有实例,例如AbstractClass.objects.all()

当然,我可以加入对所有孩子的查询,但这很糟糕,如果我添加新的子课程,它就会停止工作。

Django ORM可以实现吗?什么是优雅的解决方案?

1 个答案:

答案 0 :(得分:1)

我使用过django的其他继承方法,因为我遇到了你遇到的同样问题。我不确定是否有一个优雅的解决方案。最终,您需要在数据库上完成多个查询,并将结果合并在一起。我无法想象支持ORM的ORM。

以下是针对这种情况的常见做法:

class NotQuiteAbstractBaseClass(models.Model):
    def get_specific_subclass(self):
        if self.model1:
            return self.model1
        elif self.model2:
            return self.model2
        else:
            raise RuntimeError("Unknown subclass")

class Model1(NotQuiteAbstractBaseClass):
    def whoami(self):
        return "I am a model1"

class Model2(NotQuiteAbstractBaseClass):
    def whoami(self):
        return "I am a model2"

然后,您可以像这样查询整个列表:

for obj in NotQuiteAbstractBaseClass.objects.iterator():
    obj = obj.get_specific_subclass()
    print obj.whoami()