Есть ли способ автоматически импортировать все модели в моей папке при загрузке __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
...

Каждый класс модели, например, Vendor, имеет такую общую структуру

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)
Вернуться на верх