我正在开发一个新类,为我的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
答案 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