Как стать автором
Обновить
7
0
Михаил Юлдашев @mihail777str

Программист

«Удаление» объектов в Django

Присутствие в блоге Django и рядом стоящие слова «View» и «декораторы» заставили меня думать про View в рамках MVC. Теперь понял, что вопрос уровня БД.

Да, создание представлений таблиц с фильтрами — интересное решение, которое имеет право на существование, но, как всегда, не без подводных камней:

  • когда мы спускаемся на уровень БД, то идем к узконаправленным решениям, что снижает их универсальность;
  • нужно помнить, что представления — это все же не таблицы, поэтому как минимум для миграций нужно прописать названия оригинальных таблиц, а это уже изменения в коде. Если погружаться в решение глубже, то нужно изучить, всегда ли будут использоваться индексы, как и при работе с таблицей, и как будут происходить блокировки при записи или обновлении данных;
  • поиск всех зависимостей и написание представлений — тоже немалая работа. В нашем случае это решилось предложенным тестом, который сам нашел все зависимости. Можно пойти дальше и сделать так, чтобы декорирование необходимых моделей происходило автоматически при запуске проекта, но мы остановились на более явном определении.

Имхо, данное решение требует дополнительного изучения в силу различий между таблицей и представлением, изучения его универсальности на разных СУБД, и все же требует большего количества времени на внедрение, а в результате будут выполняться все те же фильтры.

«Удаление» объектов в Django

… потому что найти все запросы и добавить фильтр на отсутствие удаленного родительского элемента представлялось задачей, как минимум, на неделю. К тому же была высока вероятность пропустить нужный код, что привело бы к непредсказуемым последствиям.

«Удаление» объектов в Django

Да, возможно. В комментарии выше я написал, как это сделать.
Через менеджер all_objects можно запустить стандартный delete().

«Удаление» объектов в Django

Над этим вопросом мы тоже думали, только с другой стороны: «Как посмотреть удаленные объекты?». Для подобных целей можно использовать стандартный менеджер, который будет заранее сохранен декоратором под другим атрибутом модели, например all_objects:

# добавить строку в декоратор перед переопределением model_class.objects
# model_class.all_objects = copy.deepcopy(model_class.objects)

Host.objects.values('id')
# SELECT `Hosts`.`id` FROM `Hosts` WHERE NOT (`Hosts`.`is_deleted` = True)
Host.all_objects.values('id')
# SELECT `Hosts`.`id` FROM `Hosts`

# удаление работает должным образом
Host.all_objects.filter(is_deleted=True).first().delete()

«Удаление» объектов в Django

Согласен, что во многих проектах можно сделать честное удаление ночью. Но увы, это не наш случай. В силу специфики проекта мы не имеем периодов низкой активности. Так называемые «чекеры» шлют новые данные ежесекундно.

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Работает в
Дата рождения
Зарегистрирован
Активность