модели Django обычно обрабатывать поведение ON DELETE CASCADE вполне адекватно (таким образом, что работает на базах данных, которые не поддерживают его изначально.)Каковы варианты переопределения поведения каскадного удаления Django?
Однако, я изо всех сил, чтобы выяснить, что это лучший способ, чтобы переопределить поведение, где это не уместно, в следующих случаях, например:
ON DELETE RESTRICT (т.е. предотвратить удаление объекта, если он имеет дочерние записи)
ON DELETE SET NULL (т.е. не удалите дочернюю запись, но установите родительский ключ в NULL inst ead, чтобы разорвать связь)
Обновить другие связанные данные, когда запись удалена (например, удаление файла загруженное изображение)
Ниже приведены возможные способы их достижения, что я знаю:
Override
delete()
метод модели. Несмотря на то, что этот вид работ, он обходит стороной, когда записи удаляются черезQuerySet
. Кроме того, каждая модельdelete()
должна быть переопределена, чтобы убедиться, что код Django никогда не вызывается, иsuper()
не может быть вызван, поскольку он может использоватьQuerySet
для удаления дочерних объектов.Использовать сигналы. Это кажется идеальным, поскольку они вызываются при прямом удалении модели или удалении через QuerySet. Тем не менее, нет возможности предотвратить удаление дочернего объекта, поэтому он не может использоваться в ON CASCADE RESTRICT или SET NULL.
Используйте ядро базы данных, который обрабатывает это правильно (что делает Django делать в этом случае?)
Подождите, пока Джанго не поддерживает его (и жить с ошибками, до тех пор ...)
Кажется, что первый вариант является единственным жизнеспособным, но он уродлив, выкидывает ребенка с водой для ванны и рискует что-то упустить, когда добавится новая модель/отношение.
Я что-то упустил? Любые рекомендации?
+1 - согласно документации, установка 'on_delete' для полей ForeignKey потребуется также в Django 2.0. – whusterj