Django获取应用程序中的模型列表

问题描述 投票:53回答:5

所以,我在MyApp文件夹中有一个models.py文件:

from django.db import models
class Model_One(models.Model):
    ...
class Model_Two(models.Model):
    ...
...

它可以是大约10-15个班级。如何找到MyApp中的所有模型并获取其名称?

由于模型不可迭代,我不知道这是否可行。

python django model
5个回答
84
投票

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
    # ...

61
投票

从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

12
投票

我发现从应用程序中获取所有模型的最佳答案:

from django.apps import apps
apps.all_models['<app_name>']  #returns dict with all models you defined

2
投票

另一种方法是使用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'>]

1
投票

这是使用dumpdatajq的快速,无脏,无编码的解决方案:

python manage.py dumpdata oauth2_provider | jq -r '.[] | .model' | uniq

您还可以清理jq命令以获得您喜欢的格式。


额外奖励:您可以通过将-c标志添加到uniq来查看不同类型对象的计数。

© www.soinside.com 2019 - 2024. All rights reserved.