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

Fea*_*nor 55 python django model

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

from django.db import models
class Model_One(models.Model):
    ...
class Model_Two(models.Model):
    ...
...
Run Code Online (Sandbox Code Playgroud)

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

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

jul*_*ria 86

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

在这个例子中,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
    # ...
Run Code Online (Sandbox Code Playgroud)

  • 从django 1.7开始,你应该使用新的应用程序加载系统:`来自django.apps导入应用程序`包含这些方法.`django.db.models.loading`将在django 1.9中删除. (11认同)

Sjo*_*erd 69

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

  • 仍然可以在 django 4 中使用 (2认同)

ped*_*res 14

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

from django.apps import apps
apps.all_models['<app_name>']  #returns dict with all models you defined
Run Code Online (Sandbox Code Playgroud)


use*_*095 5

从@pedrotorres 解决方案出发,从@GiampaoloFerradini 的一些谨慎输入出发,这就是我最终使用的:

from django.apps import apps

app_models = [model.__name__ for model in apps.get_models()] # Returns a "list" of all models created
Run Code Online (Sandbox Code Playgroud)