我已经创建了一个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我不知道该怎么做,我试图添加此返回语句,但它不起作用,因为函数总是被调用。
发布于 2021-10-26 21:14:45
对于每个迁移的应用程序,即使没有任何更改,也会发送一次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)https://stackoverflow.com/questions/69729925
复制相似问题