【问题标题】:Disallow object creation for several models禁止为多个模型创建对象
【发布时间】:2015-07-03 22:58:10
【问题描述】:

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

我将如何执行以下操作:

class Table1:
    ...

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

对这五个表做上述模式:

  - Table1
  - Table2
  - Table3
  - Table4
  - Table5

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

【问题讨论】:

    标签: mysql django django-models


    【解决方案1】:

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

    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 中有一个上下文管理器,用于处理模型表上的这些问题。

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 1970-01-01
      • 2022-07-04
      • 2011-10-30
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 2020-03-26
      相关资源
      最近更新 更多