Django obtener lista de modelos en aplicación.

Entonces, tengo un archivo models.py en la carpeta MyApp:

from django.db import models class Model_One(models.Model): ... class Model_Two(models.Model): ... ... 

Puede ser de unos 10-15 clases. ¿Cómo encontrar todos los modelos en MyApp y obtener sus nombres?

Dado que los modelos no son iterables, no sé si esto es posible.

ACTUALIZAR

para nuevas versiones de Django verifique la respuesta de Sjoerd a continuación

Respuesta original de 2012: esta es la mejor manera de lograr lo que quiere hacer:

 from django.db.models import get_app, get_models app = get_app('my_application_name') for model in get_models(app): # do something with the model 

En este ejemplo, model es el modelo real, por lo que puede hacer muchas cosas con él:

 for model in get_models(app): new_object = model() # Create an instance of that model model.objects.filter(...) # Query the objects of that model model._meta.db_table # Get the name of the model in the database model._meta.verbose_name # Get a verbose name of the model # ... 

Desde Django 1.7 en adelante, puede usar este código, por ejemplo en su admin.py para registrar todos los modelos:

 from django.apps import apps from django.contrib import admin from django.contrib.admin.sites import AlreadyRegistered app_models = apps.get_app_config('my_app').get_models() for model in app_models: try: admin.site.register(model) except AlreadyRegistered: pass 

La mejor respuesta que encontré para obtener todos los modelos de una aplicación:

 from django.apps import apps apps.all_models[''] #returns dict with all models you defined 

Una alternativa es utilizar los tipos de contenido .

Cada modelo para cada aplicación en INSTALLED_APPS obtiene una entrada en los modelos ContentType. Esto le permite, por ejemplo, tener una clave externa para un modelo.

 >>> from django.contrib.contenttypes.models import ContentType >>> ContentType.objects.filter(app_label="auth") , , ]> >>> [ct.model_class() for ct in ContentType.objects.filter(app_label="auth")] [, , ] 

Aquí hay una solución de encoding rápida y sucia que utiliza dumpdata y jq :

 python manage.py dumpdata oauth2_provider | jq -r '.[] | .model' | uniq 

También puede limpiar el comando jq para obtener el formato a su gusto.


Bonificación: puede ver los recuentos de los diferentes tipos de objetos agregando el indicador -c a uniq .