Доступ Django к элементам подклассов из абстрактного класса

class Animal(models.Model): .... class Meta: abstract = True class Cat(models.Model, Animal): ... class Dog(models.Model, Animal): .... 

Я хочу иметь возможность возвращать все экземпляры запросов всех подклассов Animal. Допустим, у меня есть функция, называемая allData которая возвращает массив / список всех allData подклассов.

Например:

 x = animal.allData()[0] # should return the first element in the array. 

Я не возражаю, как мы это делаем, используя такие модули, как django-model-utils или нет. Я просто хочу, чтобы вернуть все подзадачи запросов.

2 Solutions collect form web for “Доступ Django к элементам подклассов из абстрактного класса”

Это невозможно в одном запросе. У вас есть два варианта: использовать django-model-utils или использовать django_polymorphic .

Полиморфизм лучше подходит для вашей задачи, однако django-model-utils создается очень заметным членом сообщества django и, как таковая, имеет много хорошей поддержки.

Если бы мне пришлось выбирать, я бы выбрал django-model-utils с момента его создания членом команды django и, таким образом, будет поддерживаться. Полиморфизм поддерживается divio, который является частной компанией, которая активно использует django в Швейцарии.

Что касается выбора подклассов. Вам нужно сделать две вещи, используя django-model-utils . Во-первых, вам нужно изменить переменную objects в вашей модели на InheritanceManager() как это (адаптировано из docs):

 from model_utils.managers import InheritanceManager class Place(models.Model): # ... objects = InheritanceManager() class Restaurant(Place): # ... class Bar(Place): # ... nearby_places = Place.objects.filter(location='here').select_subclasses() for place in nearby_places: # "place" will automatically be an instance of Place, Restaurant, or Bar 

Приведенный выше код вернет все Restaurant и Restaurant потому что он использует select_subclasses .

Возможно, вас заинтересует django_polymorphic

Пример из документации проекта:

Когда мы храним модели, которые наследуются от модели Project

 >>> Project.objects.create(topic="Department Party") >>> ArtProject.objects.create(topic="Painting with Tim", artist="T. Turner") >>> ResearchProject.objects.create(topic="Swallow Aerodynamics", supervisor="Dr. Winter") 

… и хотите получить все наши проекты, возвращаются подклассы моделей:

 >>> Project.objects.all() [ <Project: id 1, topic "Department Party">, <ArtProject: id 2, topic "Painting with Tim", artist "T. Turner">, <ResearchProject: id 3, topic "Swallow Aerodynamics", supervisor "Dr. Winter"> ] 
Interesting Posts
Python - лучший язык программирования в мире.