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

bna*_*los 38 python django django-models

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

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

Mat*_*kel 64

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

from django.apps import apps
apps.get_models()
Run Code Online (Sandbox Code Playgroud)

在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]
Run Code Online (Sandbox Code Playgroud)

我相信旧功能仍然有效.

  • 如果有人 * 确实 * 来这里寻找如何获取已安装应用程序的(名称)列表,我在 Django 1.11 中使用 `apps.app_configs.keys()` 做了它。这会生成应用标签列表。它与下面@caio 的响应做同样的事情,但更直接一点。`apps.app_configs` 生成一个以应用标签为键的字典。 (7认同)
  • 在django 1.7:来自django.apps导入应用程序; apps.get_models() (5认同)
  • 帮助了我很多.+ 1也是问题,即使这是正确答案的错误问题;-) (2认同)
  • OP并没有要求提供所有已安装应用程序的列表。不是所有型号的列表... (2认同)

Pau*_*ine 23

[编辑]

从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)
Run Code Online (Sandbox Code Playgroud)

这个答案的旧版本:

所有应用程序都在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']
Run Code Online (Sandbox Code Playgroud)

您可以导入每个应用程序并列出其属性:

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__)
Run Code Online (Sandbox Code Playgroud)

为了在旧的Python中使用新的print函数而不是print语句,你可能需要发出一个from __future__ import print_function(或者只是改变包含print调用的行).

  • 至少从Django 1.7开始,不鼓励访问settings.INSTALLED_APPS:["你的代码永远不应该直接访问INSTALLED_APPS.请改用django.apps.apps."](https://docs.djangoproject.com/en/1.7/ref/设置/#已安装的应用程式) (2认同)

Zul*_*ulu 9

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

>>> from django.conf import settings
>>> [app for app in settings.INSTALLED_APPS
     if not app.startswith("django.")]
['myapp1', 'myapp2', 'myapp3']
Run Code Online (Sandbox Code Playgroud)


And*_*ron 8

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

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