Django获取应用程序中的模型列表
所以,我在MyApp文件夹中有个models.py文件:
from django.db import models class Model_One(models.Model): ... class Model_Two(models.Model): ... ...
它可以是大约10-15个class。 如何在MyApp中find所有模型并获取他们的名字?
由于模型是不可迭代的,我不知道这是否是可能的。
这是完成你想要做的最好的方法:
from django.db.models import get_app, get_models app = get_app('my_application_name') for model in get_models(app): # do something with the model
在这个例子中, model
是实际的模型,所以你可以做很多事情:
for model in get_models(app): new_object = model() # Create an instance of that model model.objects.filter(...) # Query the objects of that model model._meta.db_table # Get the name of the model in the database model._meta.verbose_name # Get a verbose name of the model # ...
UPDATE
为更新版本的Django检查下面的Sjoerd答案
从Django 1.7开始,您可以使用此代码,例如在您的admin.py中注册所有模型:
from django.apps import apps from django.contrib import admin from django.contrib.admin.sites import AlreadyRegistered app_models = apps.get_app_config('my_app').get_models() for model in app_models: try: admin.site.register(model) except AlreadyRegistered: pass
我发现从一个应用程序获得所有模型的最佳答案:
from django.apps import apps apps.all_models['<app_name>'] #returns dict with all models you defined
另一种方法是使用内容types 。
INSTALLED_APPS中的每个应用程序的每个模型都会在ContentType模型中获得一个条目。 例如,这允许你有一个外键模型。
>>> from django.contrib.contenttypes.models import ContentType >>> ContentType.objects.filter(app_label="auth") <QuerySet [<ContentType: group>, <ContentType: permission>, <ContentType: user>]> >>> [ct.model_class() for ct in ContentType.objects.filter(app_label="auth")] [<class 'django.contrib.auth.models.Group'>, <class 'django.contrib.auth.models.Permission'>, <class 'django.contrib.auth.models.User'>]
这里有一个使用dumpdata
和jq
的快速而不干净的解决scheme:
python manage.py dumpdata oauth2_provider | jq -r '.[] | .model' | uniq
您也可以清理jq
命令以获得您喜欢的格式。
奖励:您可以通过向uniq
添加-c
标志来查看不同types对象的计数。