2012-01-02 7 views
41

Por lo tanto, tengo un archivo en la carpeta models.py MiApl:Django lista de modelos de ponerse en aplicación

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

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

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

+2

@downvoter, quiere compartir por qué ha votado negativamente? No hay nada de malo con esta pregunta (+1 para equilibrar) – juliomalegria

+0

No estoy de acuerdo con el voto a favor. Grep no es adecuado si desea conocer los modelos en tiempo de ejecución. Get_app y get_models son perfectos en ese caso. – Alasdair

+0

"conocer los modelos en tiempo de ejecución"? ¿Qué significa esto? –

Respuesta

81

ACTUALIZACIÓN

para las nuevas versiones de Django comprobar Sjoerd respuesta a continuación

Respuesta original a partir 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 que puede hacer un montón de 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 
    # ... 
+1

Muchas gracias, funcionó) – Feanor

+1

@ user1126473 me alegro de haber ayudado :) – juliomalegria

+10

Desde django 1.7, debe usar el nuevo sistema de carga de aplicaciones: 'desde django.apps import apps' que contiene estos métodos. 'django.db.models.loading' se eliminará en django 1.9. – Ben

41

De Django 1.7 en adelante, se puede utilizar 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 
1

Una alternativa es use Content Types.

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") 
<QuerySet [<ContentType: group>, <ContentType: permission>, <ContentType: user>]> 
>>> [ct.model_class() for ct in ContentType.objects.filter(app_label="auth")] 
[<class 'django.contrib.auth.models.Group'>, <class 'django.contrib.auth.models.Permission'>, <class 'django.contrib.auth.models.User'>] 
5

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

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

Aquí hay una solución rápida y sucio, sin codificación usando dumpdata y jq:

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

También puede limpiar el comando jq para obtener el formato que desee.


Bono: se puede ver el recuento de los diferentes tipos de objetos mediante la adición de la bandera -c-uniq.

+0

@Feanor https://meta.stackexchange.com/questions/121908/i-know-this-question-is-like-two-years-old-but – mgalgs