2010-11-06 24 views
29

En mi sitio web de Django, estoy creando una clase que interactúa dinámicamente con otras aplicaciones instaladas en el sitio web. Tengo que hacer una manipulación en cada campo de cada aplicación.Obtenga una lista de todas las aplicaciones instaladas en Django y sus atributos

Así que quiero guardar el nombre de todas las aplicaciones instaladas en una lista y obtener los atributos de cada una. Hay una manera de hacerlo utilizando un iterador u otra cosa?

+0

De 'manage.py' CLI: http://stackoverflow.com/questions/21566919/django-listing-installed-apps –

Respuesta

53

Bajo Django 1.7 y superior (gracias Colin Anderson):

from django.apps import apps 
apps.get_models() 

Bajo Django 1.6 y por debajo.

Si desea que todos los modelos, probar:

from django.db.models import get_models 

for model in get_models(): 
    # Do something with your model here 
    print model.__name__, [x.name for x in model._meta.fields] 

creo que la función más antigua todavía funciona.

+0

¡Perfecto! Muchas gracias – bnabilos

+2

me ayudó mucho. + 1ed la pregunta también, incluso si era la pregunta incorrecta para la respuesta correcta ;-) – AndreasT

+5

en django 1.7: desde aplicaciones de importación django.apps; apps.get_models() –

7

La lista de aplicaciones instaladas se define en settings.INSTALLED_APPS. Contiene una tupla de cadenas, por lo que puede iterar en ella para acceder al nombre de cada aplicación.

Sin embargo, no estoy seguro de lo que entendemos por atributos de cada aplicación y campos.

+0

Para los atributos, si tengo, por ejemplo, una aplicación con 2 CharField y 2 TextField, quiero para poder obtener estos campos de datos cuando los selecciono. Quiero hacer eso para cada aplicación instalada, por lo que debe ser dinámica y no codificada. Gracias – bnabilos

+0

Las aplicaciones no tienen los atributos 'CharField' y' TextField' ". ¿Estás hablando de modelos de aplicaciones o formularios de solicitud? –

+1

Lo siento por no explicarlo bien, estoy hablando de modelos de aplicación: http://docs.djangoproject.com/en/dev/ref/models/fields/#field-types – bnabilos

13

[editar]

Desde Django 1.7, acceso a settings.INSTALLED_APPS se desanima: "Your code should never access INSTALLED_APPS directly. Use django.apps.apps instead." - johanno

Así que la forma bendito es: Versión

from django.apps import apps 

for app in apps.get_app_configs(): 
    print(app.verbose_name, ":") 
    for model in app.get_models(): 
     print("\t", model) 

anterior de este respuesta:

Todas las aplicaciones están registradas en el archivo settings.py.

In [1]: from django.conf import settings 

In [2]: print(settings.INSTALLED_APPS) 
['django.contrib.auth', 'django.contrib.contenttypes', 
'django.contrib.sessions', 'django.contrib.sites', 
'django.contrib.messages', 'django.contrib.staticfiles', 
'django.contrib.admin', 'raven.contrib.django'] 

Puede importar cada aplicación y una lista de sus atributos:

In [3]: from pprint import pprint 

In [4]: for app_name in settings.INSTALLED_APPS: 
    try: 
     module_ = __import__(app_name) 
    except ImportError: 
     pass 
    map(print, ['=' * 80, "MODULE: "+app_name, '-' * 80]) 
    pprint(module_.__dict__) 

Para utilizar la nueva función de impresión en lugar de la declaración de impresión en Python mayores puede que tenga que emitir una from __future__ import print_function (o simplemente cambie la línea que contiene la llamada print).

+1

Al menos Django 1.7, no se recomienda el acceso a la configuración.INSTALLED_APPS: ["Tu código nunca debería acceder a INSTALLED_APPS. Usa django.apps.apps en su lugar."] (https://docs.djangoproject.com/en/1.7/ref/settings/#installed-apps) – johanno

7

Puede recuperar las aplicaciones instaladas por el estilo (en el intérprete):

>>> from django.conf import settings 
>>> [ app for app in settings.INSTALLED_APPS if not "django" in app ] 
['myapp1', 'myapp2', 'myapp3'] 
3

para obtener el aplicaciones reales sí mismos (no sólo los nombres), esto es lo que ocurrió:

Aunque es posible que desee realizar algún tipo de gestión de errores o filtrado.

0

Probado con Django 1.9:

from django.test.runner import DiscoverRunner 
from django.test import override_settings 
from django.apps import apps 


class DiscoverRunnerNoMigrations(DiscoverRunner): 
    def run_tests(self, *args, **kwargs): 
     app_labels = [a.label for a in apps.app_configs.values()] 
     migration_modules = dict.fromkeys(app_labels) 

     with override_settings(MIGRATION_MODULES=migration_modules): 
      return super(DiscoverRunnerNoMigrations, self).run_tests(*args, 
                    **kwargs) 

Actualice su configuración para que apunte a este corredor de prueba.

Ejecutar esto con --keepdb es muy rápido.

Cuestiones relacionadas