from os.path import exists from importlib.machinery import SourceFileLoader from django.apps import apps from django.conf import settings def transfer_objects(data_type): for app in apps.get_app_configs(): if exists(f"{app.path}/transfer_data.py"): card_module = SourceFileLoader("transfer", f"{app.path}/transfer_data.py").load_module() if not hasattr(card_module, "data_types") \ or not isinstance(card_module.data_types, dict) \ or len(card_module.data_types) < 1: continue for module_data_type, transfer_funcs in card_module.data_types.items(): if data_type == module_data_type: for transfer_func in transfer_funcs: print(f"========================== FUNCTION {transfer_func.__name__} ================================") transfer_func() def clean_old_records(model, conditions): error_file = open(f"{settings.PROJECT_ROOT}/apps/transfer/clear.error.txt", "w") non_existed_correct_city_ids = [] try: old_records = model.objects.filter(**conditions) except Exception as e: error_file.write(f"Cannot find model objects: {e}") return for old_record in old_records: correct_record_qs = model.objects.exclude(id=old_record.id) \ .exclude(**conditions) \ .filter(name=old_record.name) if correct_record_qs.exists(): correct_record = correct_record_qs.first() for rel_instance in old_record._related_instances: field_name = [related_field.name for related_field in rel_instance._meta.fields if related_field.related_model == correct_record._meta.model][0] # rebinding correct dependency instances if getattr(rel_instance, field_name) != correct_record: setattr(rel_instance, field_name, correct_record) rel_instance.save() else: non_existed_correct_city_ids.append(old_record.id) if non_existed_correct_city_ids: print(f"Non existed correct city ids: {non_existed_correct_city_ids}") return # delete old records counter = old_records.count() old_records.delete() print(f'Deleted {counter} objects.')