web-dev-qa-db-fra.com

Obtenir une liste de toutes les applications installées dans Django et leurs attributs

Sur mon site Web Django, je crée une classe qui interagit de manière dynamique avec d'autres applications installées sur le site. Je dois faire une manipulation sur chaque champ de chaque application.

Je souhaite donc enregistrer le nom de toutes les applications installées dans une liste et obtenir les attributs de chacune d’elles. Il y a un moyen de faire cela en utilisant un itérateur ou autre chose?

35
bnabilos

Sous Django 1.7 et supérieur (merci Colin Anderson):

from Django.apps import apps
apps.get_models()

Sous Django 1.6 et ci-dessous.

Si vous voulez tous les modèles, essayez:

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]

Je crois que l'ancienne fonction fonctionne toujours.

60

[modifier]

Depuis Django 1.7, il est déconseillé d’accéder à settings.INSTALLED_APPS: " Votre code ne doit jamais accéder directement à INSTALLED_APPS. Utilisez plutôt Django.apps.apps. " - johanno

La voie bénie est donc:

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)

Ancienne version de cette réponse:

Toutes les applications sont enregistrées dans le fichier 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']

Vous pouvez importer chaque application et répertorier ses attributs:

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

Pour utiliser la nouvelle fonction print à la place de l'instruction print dans les versions antérieures de Python, vous devrez peut-être générer un from __future__ import print_function (ou simplement modifier la ligne contenant l'appel print).

19
Paulo Scardine

La liste des applications installées est définie dans settings.INSTALLED_APPS. Il contient un tuple de chaînes afin que vous puissiez y effectuer une itération pour accéder au nom de chaque application.

Cependant, je ne suis pas sûr de comprendre ce que vous entendez par les champs attributs et de chaque application .

8
André Caron

Vous pouvez récupérer les applications installées comme ça (dans un interpréteur):

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

Pour obtenir les applications réelleselles-mêmes (pas seulement les noms), voici ce que j’ai trouvé:

from Django.conf import settings
from Django.utils.module_loading import import_module
apps = [import_module(appname) for appname in settings.INSTALLED_APPS]

Bien que vous souhaitiez peut-être gérer certaines erreurs, ou filtrer.

3
Cj Welborn

Testé avec 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)

Mettez à jour vos paramètres pour pointer vers cet exécuteur de test.

Exécuter ceci avec --keepdb est très rapide.

0
caio