Django:在迁移期间禁用信号

时间:2013-12-06 10:37:18

标签: django django-south

我正在Django中编写一个小型审计日志应用程序,该应用程序挂钩各种信号并将事件写入数据库。不幸的是,其中一些事件在相应的表存在之前已经被解雇,导致各种麻烦。

为了避免这种情况,我尝试添加一些触发器以暂时禁用migration / syncdb期间的日志记录 - 类似这样的内容:

from django.db.models.signals import pre_save, post_save, pre_delete
from django.db.models.signals import pre_syncdb, post_syncdb
from south.signals            import pre_migrate, post_migrate

IS_MIGRATING = False

@receiver(post_save)
def log_model_update(sender, **kwargs):
    if IS_MIGRATING:
        return
    ...

@receiver(pre_syncdb)
@receiver(pre_migrate)
def _disable_auditlog(sender, **kwargs):
    global IS_MIGRATING
    IS_MIGRATING = True

不幸的是,这不符合预期。我错过了什么?或者是否有“官方”方式来做到这一点?

2 个答案:

答案 0 :(得分:1)

在Django中可以disconnect signals。因此,您可以尝试在导致问题的迁移代码之前将信号断开连接

必须澄清我没有尝试过,所以我不完全确定它是否会起作用,但我希望它能以某种方式起作用

答案 1 :(得分:1)

我现在通过做一个丑陋的黑客并检查sys.argv并在testsyncdbmigrate期间停用事件处理程序来解决它。这显然不是一个好的解决方案,但是如问题中所示禁用事件处理程序是不够的,并且会导致干扰其他几乎无法跟踪的django应用程序。

需要禁用它进行测试,因为Django / South显然会在测试期间迁移数据库。涉及事件处理程序的测试需要明确激活事件处理。