Как получить все экземпляры, которые унаследованы от того же родительского класса в Django - PullRequest
3 голосов
/ 06 января 2010

У меня есть две модели, унаследованные от одного абстрактного базового класса.

Я бы ожидал, что смогу получить все экземпляры классов, которые являются потомками базового класса, с чем-то вроде AbstractClass.objects.all ()

Конечно, я могу присоединиться к запросам для всех детей, но это ужасно, и оно перестает работать, если я добавляю новый дочерний класс.

Возможно ли это с Django ORM? Каким было бы элегантное решение?

1 Ответ

1 голос
/ 06 января 2010

Я использовал другие методы наследования django, потому что столкнулся с той же проблемой, с которой вы столкнулись. Я не уверен, что есть элегантное решение. В конечном счете, вам нужно выполнить несколько запросов к БД и объединить результаты. Я не могу представить, что 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...