Py学习  »  Django

Django post_迁移信号被多次调用

Evandro Lippert • 2 年前 • 749 次点击  

我创建了一个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语句,但它不起作用,因为函数一直在被调用。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/132590
 
749 次点击  
文章 [ 1 ]  |  最新文章 2 年前
Iain Shelvington
Reply   •   1 楼
Iain Shelvington    2 年前

这个 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)