2015-07-03 3 views
0

Я выполняю миграцию базы данных, и мне нужно убедиться (временно) для определенных таблиц не создаются новые элементы.Запретить создание объекта для нескольких моделей

Как бы сделать следующее:

class Table1: 
    ... 

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

ли вышеуказанный образец для этих пяти таблиц:

- Table1 
    - Table2 
    - Table3 
    - Table4 
    - Table5 

Могу ли я определить его в сигнал или что-то другое, так что легче добавить/Удалить ?

ответ

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-запросы. Я уверен, что есть другие пути записи, которые я тоже пропустил.

Также, если вы просто пытаетесь прекратить запись из процесса веб-сервера, в то время как процесс миграции редактирует таблицу, вы можете использовать блокировку таблицы. Если вы работаете в MySQL, для управления ими на таблицах моделей есть менеджер контекстов в django-mysql.

Смежные вопросы