from os.path import exists from importlib.machinery import SourceFileLoader from django.apps import apps from collections import OrderedDict import transfer.models as legacy_models def transfer_objects(data_type): models_list = {} for app in apps.get_app_configs(): if exists(f"{app.path}/transfer.py"): card_module = SourceFileLoader("transfer", f"{app.path}/transfer.py").load_module() if not hasattr(card_module, "card") or len(card_module.card) < 1: continue for model, card in card_module.card.items(): if "data_type" in card and data_type == card["data_type"]: card['app_label'] = app.label models_list[model] = card if len(models_list) < 1: print(f"Models with data type {data_type} not found in structure") exit(1) models_list = sort_by_dependencies(models_list) for model, card in models_list.items(): transfer_model(model, card) def sort_by_dependencies(data): """Сортировка моделей по зависимостям""" """Сначала мы сортируем модели по зависимостям в обратном порядке, используя сортировку вставкой""" result = [] for model, card in data.items(): if "dependencies" in card and isinstance(card['dependencies'], tuple): for model_dependency in result: if model_dependency in card['dependencies']: result.insert(result.index(model_dependency), model) break else: result.append(model) """Затем мы создаём сортированный словарь из реверса получившегося результата""" result = OrderedDict( [(model, data[model]) for model in reversed(result)] ) return result def transfer_model(model, card): print(f"=================================================\r\n" f"MODEL: {model}\r\n" f"=================================================") try: app_model = apps.get_model(app_label=card['app_label'], model_name=model) except LookupError as e: print(f"ERROR: model {model} from {card['app_label']} can not be loaded: {e}") return querysets = {} for legacy_table, fields in card['fields'].items(): try: legacy_model = apps.get_model(app_label="transfer", model_name=legacy_table) except LookupError as e: print(f"ERROR: legacy model {model} can not be loaded: {e}") return print(f"APP MODEL: {app_model}") print(f"LEGACY MODEL: {legacy_model}") print(f"FIELDS: {fields}")