有没有办法在加载 __init__.py 时自动导入文件夹中的所有模型?
Is there a way to auto-import all the models in my folder when loading __init__.py?
在我的 Python 3.9、Django 3.2 项目中,我有这样的通用文件夹结构
- manage.py
+ cbapp
+ models
- __init__.py
- vendor.py
- user_preferences.py
在我的 init.py 文件中,我列出了所有模型条目...
from .vendor import Vendor
from .user_preferences import UserPreferences
...
每个型号 class,例如供应商,有这样的一般结构
from django.db import models
class Vendor(models.Model):
...
每次添加新模型时,我都必须在 init.py 文件中添加一行。有什么方法可以编写 init.py 文件,以便它自动导入我添加到模型目录中的新文件?
您正在寻找的是一些花哨的动态导入,例如 these。
如果您的模型名称在模块名称中始终采用相同的模式,init.py 中的以下代码可能会起作用:
import os, glob
path = os.path.dirname(__file__)
modules = [os.path.basename(f)[:-3] for f in glob.glob(path + "/*.py")
if not os.path.basename(f).startswith('_')]
stripped_path = os.path.relpath(path).replace('/', '.')
imports = {}
for module in modules:
model_name = module.title().replace("_", "")
imports[model_name] = getattr(__import__(stripped_path + "." + module, fromlist=[model_name]), model_name)
print(imports)
globals().update(imports)
在我的 Python 3.9、Django 3.2 项目中,我有这样的通用文件夹结构
- manage.py
+ cbapp
+ models
- __init__.py
- vendor.py
- user_preferences.py
在我的 init.py 文件中,我列出了所有模型条目...
from .vendor import Vendor
from .user_preferences import UserPreferences
...
每个型号 class,例如供应商,有这样的一般结构
from django.db import models
class Vendor(models.Model):
...
每次添加新模型时,我都必须在 init.py 文件中添加一行。有什么方法可以编写 init.py 文件,以便它自动导入我添加到模型目录中的新文件?
您正在寻找的是一些花哨的动态导入,例如 these。
如果您的模型名称在模块名称中始终采用相同的模式,init.py 中的以下代码可能会起作用:
import os, glob
path = os.path.dirname(__file__)
modules = [os.path.basename(f)[:-3] for f in glob.glob(path + "/*.py")
if not os.path.basename(f).startswith('_')]
stripped_path = os.path.relpath(path).replace('/', '.')
imports = {}
for module in modules:
model_name = module.title().replace("_", "")
imports[model_name] = getattr(__import__(stripped_path + "." + module, fromlist=[model_name]), model_name)
print(imports)
globals().update(imports)