From 5c559734c62fd764d0040b2cf225bdcd0db9d2d9 Mon Sep 17 00:00:00 2001 From: "wskaudh@qq.com" Date: Wed, 29 May 2024 12:13:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E5=90=8E=E7=AB=AF=E7=9A=84get=5Fmodel?= =?UTF-8?q?=5Ffrom=5Fapp=E5=87=BD=E6=95=B0=E8=BF=9B=E8=A1=8C=E9=87=8D?= =?UTF-8?q?=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/dvadmin/utils/models.py | 73 +++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 18 deletions(-) diff --git a/backend/dvadmin/utils/models.py b/backend/dvadmin/utils/models.py index fb0c2ba7..aa260bc6 100644 --- a/backend/dvadmin/utils/models.py +++ b/backend/dvadmin/utils/models.py @@ -114,28 +114,65 @@ def get_all_models_objects(model_name=None): return settings.ALL_MODELS_OBJECTS or {} +from django.apps import apps +import importlib +import pkgutil +import inspect + +def find_modules(app_module): + """ + 递归查找给定模块及其子模块 + """ + modules = None + for _, submodule_name, is_pkg in pkgutil.iter_modules(app_module.__path__): + full_module_name = f"{app_module.__name__}.{submodule_name}" + submodule = importlib.import_module(full_module_name) + modules.append(submodule) + if is_pkg: + modules.extend(find_modules(submodule)) + return modules + + def get_model_from_app(app_name): """获取模型里的字段""" - model_module = import_module(app_name + '.models') - filter_model = [ - getattr(model_module, item) for item in dir(model_module) - if item != 'CoreModel' and issubclass(getattr(model_module, item).__class__, models.base.ModelBase) - ] + model_list = [] - for model in filter_model: - if model.__name__ == 'AbstractUser': - continue - fields = [ - {'title': field.verbose_name, 'name': field.name, 'object': field} - for field in model._meta.fields + + try: + # 注释编号:django-vue3-admin-models111112 + # 功能说明:因为model.py文件不在对应的app根目录,所以必须要使用如下方法拿到models + app_config = apps.get_app_config(app_name) + model_module_dict = app_config.models + filter_model = [] + if bool(model_module_dict): # 判断是否为空 + for model_name, model_class in model_module_dict.items(): + filter_model.append(model_class) + # 注释编号:django-vue3-admin-models111112 + except Exception as e: + #注释编号: django-vue3-admin-models280912:如果上面的代码出现错误,那只能使用如下方法进行导入model了,这种方法是当前的model.py文件在对应的apps.py根目录下才行的 + model_module = import_module(app_name + '.models') + filter_model = [ + getattr(model_module, item) for item in dir(model_module) + if item != 'CoreModel' and issubclass(getattr(model_module, item).__class__, models.base.ModelBase) ] - model_list.append({ - 'app': app_name, - 'verbose': model._meta.verbose_name, - 'model': model.__name__, - 'object': model, - 'fields': fields - }) + + + if bool(filter_model): # 判断是否为空 + for model in filter_model: + if model.__name__ == 'AbstractUser': + continue + fields = [ + {'title': field.verbose_name, 'name': field.name, 'object': field} + for field in model._meta.fields + ] + model_list.append({ + 'app': app_name, + 'verbose': model._meta.verbose_name, + 'model': model.__name__, + 'object': model, + 'fields': fields + }) + return model_list -- Gitee