扫描Django应用程序模块

时间:2014-10-07 00:18:07

标签: python django python-import

我正在开发一个新类,为我的django应用添加一些功能,需要扫描/收集从这个类继承的每个类。我已经掌握了一切可以在我导入的特定模块中扫描它们,但我想知道在我的每个应用程序中扫描特定文件的最佳方法是什么(只有一个&# 39;我已定义过)?我知道其他一些应用程序会做这样的事情,显然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 个答案:

答案 0 :(得分:2)

您可能会考虑采用不同的方法。您可以通过使用元类来获取模型本身以在系统中注册自己,而不是通过模型扫描来查找相关模型。 Marty Alchin有一个简单方法可以做到这一点。

答案 1 :(得分: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