Сигнал Django post_migrate вызывался несколько раз

#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)