禁止为多个模型创建对象

时间:2015-07-03 22:58:10

标签: mysql django django-models

我正在进行数据库迁移,我需要确保(暂时)没有为某些表创建新项目。

我如何做以下事项:

class Table1:
    ...

   def save(self, *args, **kwargs):
       if not self.pk:
           raise
    super(Table1, self).save(*args, **kwargs)

对这五个表格执行上述模式:

  - Table1
  - Table2
  - Table3
  - Table4
  - Table5

我可以在信号或其他内容中定义它,以便更容易添加/删除吗?

1 个答案:

答案 0 :(得分:0)

是的,您可以使用信号。例如:

from django.db.models.signals import pre_delete, pre_save


def block_writes(sender, **kwargs):
    if sender in (Table1, Table2, Table3, Table4, Table5):
        raise Exception("Writes blocked for these tables right now")


# To start blocking
pre_delete.connect(block_writes)
pre_save.connect(block_writes)


# To stop
pre_delete.disconnect(block_writes)
pre_save.disconnect(block_writes)

这不会停止所有写入,但不能,因为他们不会发送所有信号。例如,Model.objects.update()将继续工作,以及原始SQL查询。我确定还有其他写作路径,我也错过了。

此外,如果您只是在迁移过程编辑表时尝试停止Web服务器进程的写入,则可以使用表锁。如果您使用的是MySQL,django-mysql中的上下文管理员可以在您的模型上处理这些内容。'表。