Сигнал Django post_migrate был вызван несколько раз
Я создал 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
Я понятия не имею, что делать, я пытался добавить этот оператор возврата, но он не работает, потому что функция вызывается все время.
Сигнал 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)