加载 __init__.py 时,有没有办法自动导入我文件夹中的所有模型?

Posted

技术标签:

【中文标题】加载 __init__.py 时,有没有办法自动导入我文件夹中的所有模型?【英文标题】:Is there a way to auto-import all the models in my folder when loading __init__.py? 【发布时间】:2021-12-20 20:03:10 【问题描述】:

在我的 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
...

每个模型类,例如供应商,有这样的一般结构

from django.db import models

class Vendor(models.Model): 
    ...

每次添加新模型时,我都必须在 init.py 文件中添加一行。有什么方法可以编写我的 init.py 文件,以便它自动导入我添加到模型目录中的新文件?

【问题讨论】:

【参考方案1】:

您正在寻找一些花哨的动态导入,例如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)

【讨论】:

以上是关于加载 __init__.py 时,有没有办法自动导入我文件夹中的所有模型?的主要内容,如果未能解决你的问题,请参考以下文章

使 Python 中的 distutils 自动查找包

Python模块包中__init__.py文件的作用

关于导包问题

Python __init__.py文件的作用

Python模块包(pycharm右键创建文件夹和python package的区别)中__init__.py文件的作用

如何在包中只导入没有 exec __init__.py 的子模块