我正在开发一个新的类,为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发布于 2014-10-07 06:42:54
你可能会考虑另一种方法。与其通过扫描模型来查找相关的模型,不如让模型本身通过使用元类将自己注册到系统中。马蒂·阿尔钦有一个很好的例子,说明了一种简单的方法。
发布于 2014-10-07 00:46:51
虽然我仍然很好奇是否有更好的解决方案,但下面的内容似乎能满足我的需求。
#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_APPShttps://stackoverflow.com/questions/26226749
复制相似问题