models.PROTECT - настройка таблицы в базе данных. Вам нужно будет выполнить необработанные SQL инструкции, чтобы переопределить его, и это будет спецификация базы данных c (и я понятия не имею, как это сделать).
Альтернативой является перемещение по «дереву» объектов, которые вы хотите удалить, а затем удаление объектов, работающих с защищенных «листьев» внутрь, в «ствол». Так что если бы у вас было
class Bar( models.Model):
user = models.ForeignKey( User, models.PROTECT, ...)
...
class Foo( models.Model):
bar = models.ForeignKey( Bar, models.PROTECT, ... )
...
Затем, чтобы удалить пользовательский объект user
, вам понадобится
def delete_user( user):
for bar in user.bar_set.all():
bar.foo_set.all().delete()
bar.delete()
user.delete()
Я бы заключил его в транзакцию, чтобы он либо удалил все, либо ничего.
Он ударит по БД несколько раз. Я предполагаю, что количество связанных (bar
, baz
) объектов довольно мало и что вы не будете удалять пользователей очень часто.
Мне всегда было интересно, что делать, если экземпляр a
имеет отношение защищенного внешнего ключа к экземпляру b
и наоборот (возможно, через промежуточные соединения). По номинальной стоимости это означает, что вы можете создавать объекты, которые нельзя удалить.