2014-10-07 87 views
0

我正在开发一个新类,为我的django应用程序添加一些功能,并且需要扫描/收集每个从此类继承的类。我已经准备好了在我导入的特定模块中扫描它们的所有内容,但是我想知道在每个应用程序中扫描特定文件的最佳方式(只是我定义的那个文件) ?我知道其他一些应用程序可以做这样的事情,显然django本身就是这样做的。我可能会一起窃取一些东西来扫描文件系统,但我想知道是否有更好的/常用的方法来解决这个问题?我找不到太多。扫描Django应用程序模块

我总是可以在单个包中定义类,但由于它们与应用程序绑定,我认为最好在每个应用程序中定义它们,而不是从各处导入模型。

例如所需的接口:

def get_app_implementations(module_name): 
    # ... What's the least hacky way to get each of the app packages? 
    # in a way that they can be imported using __import__ or the likes 
    results = [] 
    for package in packages: 
     try: 
      scanned = __import__("{0}.{1}".format(package,module_name)) 
      results.append(scanned) 
     except ImportError: 
      pass 
    return results 

回答

2

你可能会考虑一种不同的方法。而不是通过模型扫描找到相关的模型,而是通过使用元类来让模型自己向系统注册。 Marty Alchin有一个简单的方法来做到这一点的一个很好的例子。

+0

这看起来很有希望,感觉更清洁。谢谢! – RutledgePaulV 2014-10-07 12:27:02

+0

有没有办法让django在每个应用程序包中自动导入一个模块,以便我的插件可以注册而不必显式调用导入? ;) – RutledgePaulV 2014-10-07 13:27:55

+0

听起来像1.7中新的[AppConfig功能](https://docs.djangoproject.com/en/1.7/ref/applications/)是你想要的。 – 2014-10-07 14:05:39

0

看起来好像下面会满足我的需求,但我仍然好奇,如果有更好的解决方案。

#loader.py 
from django.conf import settings 
import importlib 

def load_from_apps(name): 

    results = [] 
    for app in settings.CUSTOM_APPS: 
     try: 
      scanned = importlib.import_module("{0}.{1}".format(app, name)) 
      results.append(scanned) 
     except ImportError: 
      pass 
    return results 



#settings.py 
INSTALLED_APPS = (
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
) 

CUSTOM_APPS = (
    'CustomApp1', 
    'CustomApp2' 
) 

INSTALLED_APPS += CUSTOM_APPS 
相关问题