Получить список всех установленных приложений в Django и их атрибутах
На моем сайте Django я создаю класс, который динамически взаимодействует с другими приложениями, установленными на веб-сайте. Я должен делать манипуляции в каждом поле каждого приложения.
Итак, я хочу сохранить имя всех установленных приложений в списке и получить атрибуты каждого из них. Есть ли способ сделать это, используя итератор или что-то еще?
Ответы
Ответ 1
Под 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]
Я считаю, что старая функция все еще работает.
Ответ 2
[Править]
Since Django 1.7, accessing settings.INSTALLED_APPS
is discouraged: "Your code should never access INSTALLED_APPS directly. Use django.apps.apps instead." – 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
).
Ответ 3
Список установленных приложений определяется в settings.INSTALLED_APPS
. Он содержит кортеж строк, поэтому вы можете перебирать его для доступа к каждому имени приложения.
Однако я не уверен, что вы подразумеваете под каждым атрибутом приложения и полями.
Ответ 4
Вы можете получить установленные приложения (в переводчике):
>>> from django.conf import settings
>>> [app for app in settings.INSTALLED_APPS
if not app.startswith("django.")]
['myapp1', 'myapp2', 'myapp3']
Ответ 5
Чтобы получить фактические приложения сами (а не только имена), вот что я придумал:
from django.conf import settings
from django.utils.module_loading import import_module
apps = [import_module(appname) for appname in settings.INSTALLED_APPS]
Хотя вы можете выполнить обработку ошибок или фильтрацию.
Ответ 6
Протестировано с 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)
Обновите настройки, чтобы они указывали на этого тестового бегуна.
Выполнить это с --keepdb очень быстро.
Ответ 7
Работает над Django 1. 11+ (я работаю над Django 2.2)
from django.conf import settings
from django.apps import apps
# get complete list of all apps
list_of_apps = [apps.get_app_config(app_name.split('.')[-1]) \
for app_name in settings.INSTALLED_APPS]
# app_name.split('.')[-1] we need, because some system apps has dots in name
# like 'django.contrib.admin', and app_label is 'admin'
# get list of models for one specific app. For example first app in list_of_apps
models_list = [model for name, model in list_of_apps[0].models.items() \
if not model._meta.auto_created]
# we outfiltered auto_created models, because they are not in models.py
# and had been created automatically by Django