Получить список всех установленных приложений в Django и их атрибуты - PullRequest
35 голосов
/ 06 ноября 2010

На моем сайте Django я создаю класс, который динамически взаимодействует с другими приложениями, установленными на сайте.Я должен выполнить манипуляции с каждым полем каждого приложения.

Поэтому я хочу сохранить имя всех установленных приложений в списке и получить атрибуты каждого из них.Есть способ сделать это, используя итератор или что-то еще?

Ответы [ 6 ]

61 голосов
/ 06 ноября 2010

Под Django 1.7 и выше (спасибо Колин Андерсон):

from django.apps import apps
apps.get_models()

Под Django 1.6 и ниже.

Если вы хотите все модели, попробуйте:

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]

Я считаю, что старая функция все еще работает.

22 голосов
/ 06 ноября 2010

[править]

Начиная с Django 1.7, доступ к settings.INSTALLED_APPS не рекомендуется: " Ваш код никогда не должен напрямую обращаться к INSTALLED_APPS. Вместо этого используйте django.apps.apps. " - johanno

Итак, благословенный путь:

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)

Старая версия этого ответа:

Все приложения зарегистрированы в файле 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']

Вы можете импортировать каждое приложение и перечислить их атрибуты:

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

Чтобы использовать новую функцию печати вместо оператора print в старом Python, вам может потребоваться ввести from __future__ import print_function (или просто изменить строку, содержащую вызов print).

8 голосов
/ 06 ноября 2010

Список установленных приложений определен в settings.INSTALLED_APPS.Он содержит набор строк, поэтому вы можете использовать его для доступа к имени каждого приложения.

Однако я не уверен, что вы подразумеваете под атрибутами и каждого приложения..

7 голосов
/ 08 июля 2012

Вы можете получить установленные приложения так (в интерпретаторе):

>>> from django.conf import settings
>>> [ app for app in settings.INSTALLED_APPS if not "django" in app ]
['myapp1', 'myapp2', 'myapp3']
3 голосов
/ 30 августа 2014

Чтобы получить сами приложения (, а не только имена ), вот что я придумал:

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

Хотя вы можете захотеть сделатьнекоторая обработка ошибок или фильтрация.

0 голосов
/ 21 января 2018

Протестировано с Джанго 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)

Обновите ваши настройки, чтобы они указывали на этого бегуна.

Выполнить это с --keepdb очень быстро.

...