Форум сайта python.su
Добрый день.
Подскажите как в SQLAlchemy создать дерево категорий в которых нельзя было бы удалить не пустую категорию?
Т.е. что бы к примеру проходил такой тест:
root = Category(name='root') category = Category(name='category', parent=root) db.session.add(category) db.session.commit() db.session.delete(root) self.assertRaises(IntegrityError, db.session.commit)
Офлайн
Самое простое решение - предварительно выбирать для удаления только те записи у которых нет children.
Хотя вообще можно покопать в сторону настроек cascade relationship`a.
Офлайн
В сторону cascade relationship копаю вторые сутки. Уже и методом тыка перебираю. Пока не получается. В джанговских моделях можно в таком случае поставить так:
class Category(models.Model): name = models.CharField(max_length=140) parent = models.ForeignKey( 'self', related_name="sub_categories", null=True, blank=True, on_delete=models.PROTECT)
Офлайн
а if не решает проблему?
Офлайн
sander
Да я тоже написал, что проще постанализ делать, чем городить дополнительную логику в модели. Не есть это гуд. Или просто при выборе объекта из БД для удаления сразу отсекать объекты у которых есть children…
Офлайн
4kpt_III,sander
Спасибо за ответы. На основе них решил повесить событие на удаление категории
@db.event.listens_for(Category, 'before_delete') def receive_before_delete(mapper, connection, target): """ Вызвать исключение при попытки удалить категорию содержащую объекты. """ if target.sub_categories: raise IntegrityError("Can't delete not empty category", None, None)
None, None
Офлайн
а смысл вешать ексепш и оборачивать запрос в try-except?
Офлайн
sander
Что бы не делать чепочку проверок через if.
К примеру при попытке удалить категорию которая содержит объекты вылетит ошибка. По анологии решил сделать и при удалении категории.
Т.е. в одном try-except сразу проверять целостность данных и двигаться дальше, либо сообщить об этом пользователю.
Офлайн
Хотя не уверен что правильно вызывать IntegrityError на уровне логики приложения…
Офлайн
Много ли мест, где в приложении будет вызываться удаление категории?
Офлайн