#python #python-3.x #django #django-signals
Вопрос:
Я создал post_migrate с целью синхронизации всех данных внутри таблицы при каждом запуске миграции. Это фрагмент файла post_migrate:
# signals.py @receiver(post_migrate) def full_sync_if_model_change(plan, **kwargs): if plan: models_set = set() for file, _ in plan: for model in file.operations: try: model = SyncModel.objects.get( app_name=file.app_label, model_name=model.model_name ) models_set.add(model) except ObjectDoesNotExist: pass print(models_set) if models_set: for model in models_set: model.set_full_sync() run_update_sync(model, False) return
Однако, когда я запускаю миграцию, она вызывается 6 раз; как вы можете видеть в результатах миграции:
evandro@evandro-340XAA-350XAA-550XAA:~/Desktop/.../test_service$ python3 manage.py migrateOperations to perform: Apply all migrations: admin, auth, contenttypes, django_cron, lakehouse_sync, sessions, test_models Running migrations: Applying test_models.0019_auto_20211026_2052... OK set() set() set() set() set() set()
Я добавлю сюда также файл приложений:
class LakeSyncConfig(AppConfig): name = "lake_sync" def ready(self): """Import signals""" import lakehouse_sync.core.delete_action from . import signals
Я понятия не имею, что делать, я пытался добавить этот оператор return, но он не работает, потому что функция вызывается все время.
Ответ №1:
post_migrate
Сигнал отправляется один раз для каждого перенесенного приложения, даже если изменений не было. Передайте sender
параметр при подключении сигнала, чтобы запустить функцию только один раз, когда ваше приложение перенесено
def full_sync_if_model_change(plan, **kwargs): ... class LakeSyncConfig(AppConfig): name = "lake_sync" def ready(self): post_migrate.connect(full_sync_if_model_change, sender=self)