2010-11-06 11 views
29

Nel mio sito Web Django, sto creando una classe che interagisce in modo dinamico con altre applicazioni installate nel sito web. Devo fare una manipolazione su ogni campo di ogni applicazione.Ottieni un elenco di tutte le applicazioni installate in Django e i loro attributi

Quindi voglio salvare il nome di tutte le applicazioni installate in un elenco e ottenere gli attributi di ciascuno. C'è un modo per farlo usando un iteratore o qualcos'altro?

+0

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

risposta

53

Sotto Django 1.7 e superiori (grazie Colin Anderson):

from django.apps import apps 
apps.get_models() 

Sotto Django 1.6 e sotto.

Se volete tutti i modelli, provare:

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] 

credo che la funzione più vecchio funziona ancora.

+0

Perfetto! Grazie mille – bnabilos

+2

Mi ha aiutato molto. + 1ed la domanda pure, anche se era la domanda sbagliata per la risposta giusta ;-) – AndreasT

+5

in django 1.7: da django.apps import app; apps.get_models() –

7

L'elenco delle applicazioni installate è definito in settings.INSTALLED_APPS. Contiene una tupla di stringhe, quindi puoi eseguirne l'iterazione per accedere al nome di ciascuna applicazione.

Tuttavia, non sono sicuro di cosa si intende per attributi di ciascuna applicazione ecampi.

+0

Per gli attributi, Se si dispone ad esempio di un'applicazione con 2 CharField e 2 TextField, desidero essere in grado di ottenere questi dati di campi quando lo seleziono. Voglio farlo per ogni applicazione installata, quindi dovrebbe essere dinamica e non codificata. Grazie – bnabilos

+0

Le applicazioni non hanno attributi 'CharField' e' TextField' ". Stai parlando di modelli di applicazione o moduli di domanda? –

+1

Mi dispiace per non averlo spiegato bene, sto parlando di modelli di applicazione: http://docs.djangoproject.com/en/dev/ref/models/fields/#field-types – bnabilos

13

[modifica]

Dal Django 1.7, accedendo settings.INSTALLED_APPS è scoraggiato: "Your code should never access INSTALLED_APPS directly. Use django.apps.apps instead." - johanno

Quindi il modo beato: versione

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) 

più vecchio di questa risposta:

Tutte le applicazioni sono registrate nel file 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'] 

È possibile importare ogni applicazione ed elencare i loro attributi:

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__) 

Per poter utilizzare la nuova funzione di stampa anziché l'istruzione di stampa nei vecchi Python potrebbe essere necessario emettere un from __future__ import print_function (o semplicemente cambia la riga contenente la chiamata print).

+1

Almeno Django 1.7, accesso alle impostazioni.INSTALLED_APPS è sconsigliato: ["Il tuo codice non dovrebbe mai accedere direttamente a INSTALLED_APPS. Utilizza invece django.apps.apps."] (https://docs.djangoproject.com/en/1.7/ref/settings/#installed-apps) – johanno

7

È possibile recuperare le applicazioni installate come quello (in interprete):

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

Per ottenere l'attuale applicazioni stessi (non solo i nomi), questo è ciò che mi si avvicinò con:

Anche se è possibile che si desideri eseguire la gestione degli errori o il filtraggio.

0

Testato 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) 

Aggiornare le impostazioni per puntare a questo corridore di prova.

L'esecuzione di questo file con --keepdb è molto veloce.

Problemi correlati