获取Django中所有已安装应用程序的列表及其属性

时间:2010-11-06 00:40:00

标签: python django django-models

在我的Django网站上,我正在创建一个与网站中安装的其他应用程序动态交互的类。我必须对每个应用程序的每个字段进行操作。

所以我想在列表中保存所有已安装应用程序的名称,并获取每个应用程序的属性。有一种方法可以使用迭代器或其他东西吗?

7 个答案:

答案 0 :(得分:61)

在Django 1.7及以上(感谢Colin Anderson):

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]

我相信旧功能仍然可以使用。

答案 1 :(得分:22)

[编辑]

  

自Django 1.7以来,不鼓励访问settings.INSTALLED_APPS:“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__)

为了在较旧的Python中使用新的打印功能而不是print语句,您可能需要发出from __future__ import print_function(或只是更改包含print调用的行。)

答案 2 :(得分:8)

已安装的应用程序列表在settings.INSTALLED_APPS中定义。它包含一个字符串元组,因此您可以迭代它以访问每个应用程序的名称。

但是,我不确定每个应用程序的属性字段的含义。

答案 3 :(得分:7)

您可以检索已安装的应用(在解释器中):

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

答案 4 :(得分:3)

要自己获取实际的应用不仅仅是名称),这就是我想出的:

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

虽然您可能想要进行一些错误处理或过滤。

答案 5 :(得分:0)

使用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运行它是非常快的。

答案 6 :(得分:0)

在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