2010-04-29 223 views
0

我使用django,並有一個很長的models.py文件。如何列出python文件中給定類型的所有類?

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

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

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

有沒有辦法讓文件中的所有類的列表(models.Model)?

回答

4

Django提供了一些實用方法來獲取模型類。

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

當你說:

...類的文件,其中有實例...

我想你的意思」 ......類的文件,其中有子類的...」。如果是這樣的話:

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

@Max Shawabkeh:謝謝你的糾正。我正在考慮'__dict__'和'values',我做了那個愚蠢的錯誤。 – 2010-04-29 09:31:43

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

相關問題