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)
我相信旧功能仍然有效.
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调用的行).
您可以检索已安装的应用程序(在解释器中):
>>> 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)
已安装的应用程序列表在中定义settings.INSTALLED_APPS.它包含一个字符串元组,因此您可以迭代它以访问每个应用程序的名称.
但是,我不确定每个应用程序的属性和字段的含义.