如何在python文件中列出给定类型的所有类?

时间:2010-04-29 09:17:13

标签: python django

我使用django,并且有一个很长的models.py文件。

class Foo(models.Model):
     name = models.CharField()

class Bar(models.Model):
     name = models.CharField()

class Fab(models.Model):
     name = models.CharField()

有没有办法列出文件中所有类(models.Model)的实例?

4 个答案:

答案 0 :(得分:4)

Django提供了一些实用方法来获取模型类。

from django.db.models.loading import get_models, get_app
app = get_app('myappname')
models = get_models(app)

答案 1 :(得分:2)

当你说:

  

...文件中的类是...的实例

我认为你的意思是“...文件中的类是......的子类”。如果是这样的话:

classes = [cls for cls in dir(module)
           if issubbclass(getattr(module, cls), models.Model)]

答案 2 :(得分:1)

inspect模块可能会对您有所帮助。以下是我编写的插件管理器类中的一些代码,可以作为示例。

def load_plugin_file(self, pathname):
    '''Return plugin classes in a plugin file.'''

    name, ext = os.path.splitext(os.path.basename(pathname))
    f = file(pathname, 'r')
    module = imp.load_module(name, f, pathname, 
                             ('.py', 'r', imp.PY_SOURCE))
    f.close()

    plugins = []
    for dummy, member in inspect.getmembers(module, inspect.isclass):
        if issubclass(member, Plugin):
            p = member(*self.plugin_arguments,
                       **self.plugin_keyword_arguments)
            if self.compatible_version(p.required_application_version):
                plugins.append(p)

    return plugins

另一种方法可能是使用内置函数globalsissubclassisinstance

答案 3 :(得分:0)

在最新版本的Django中,django.db.models.loading显然不再存在,但是您可以使用以下命令列出应用程序的模型:

from django.apps import apps

app = apps.get_app_config("your_app_name")
models = app.get_models()

for model in models:
    print(model)