所以,我在MyApp文件夹中有一个models.py文件:
from django.db import models
class Model_One(models.Model):
...
class Model_Two(models.Model):
...
...
它可以是大约10-15个班级。如何找到MyApp中的所有模型并获取其名称?
由于模型不可迭代,我不知道这是否可行。
UPDATE
对于较新版本的Django,请查看下面的Sjoerd答案
2012年的原始答案:这是完成您想要做的事情的最佳方式:
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
# ...
从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
另一种方法是使用Content 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
的快速,无脏,无编码的解决方案:
python manage.py dumpdata oauth2_provider | jq -r '.[] | .model' | uniq
您还可以清理jq
命令以获得您喜欢的格式。
额外奖励:您可以通过将-c
标志添加到uniq
来查看不同类型对象的计数。