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() [ , , ]