Acceso Django a subclases de clase abstracta.

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

Quiero poder devolver todas las instancias de querysets de todas las subclases de Animal. Digamos que tengo una función llamada allData que devuelve una matriz / lista de todas las subclases querysets.

Por ejemplo:

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

No me importa cómo lo hagamos, usando módulos como django-model-utils o no. Solo quiero poder devolver todas las subclases querysets.

Esto no es posible en una consulta. Tiene dos opciones, un uso para usar django-model-utils o puede usar django_polymorphic .

Polimórfico se adapta mejor a su tarea, sin embargo, django-model-utils está hecho por un miembro muy prominente de la comunidad de django y, como tal, tiene mucho apoyo.

Si tuviera que elegir, elegiría django-model-utils ya que está hecho por un miembro del equipo de django y, por lo tanto, será compatible. Polymorphic es compatible con divio, que es una empresa privada que utiliza en gran medida django en Suiza.

En cuanto a cómo seleccionar subclases. Necesitas hacer dos cosas usando django-model-utils . En primer lugar, debe cambiar la variable de objects en su modelo a InheritanceManager() así (adaptado de documentos):

 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 

El código anterior devolverá todas las Bar y Restaurant porque utiliza las select_subclasses .

Usted podría estar interesado en django_polimórfico

Ejemplo de documentos del proyecto:

Cuando almacenamos modelos que heredamos de un modelo de 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") 

… y desea recuperar todos nuestros proyectos, se devuelven los modelos subclasificados:

 >>> Project.objects.all() [ , ,  ]