Django как удалить профиль и сообщения пользователя и все ассоциации после удаления пользователя?
Я пишу проект django. И хотите знать, после того, как пользователь удаляет свою учетную запись, есть ли способ сборки django для автоматического удаления всех объектов, связанных с этим пользователем(например, какой-то общий foreign_key)? Или я должен использовать сигнал "post_delete" для удаления всех связанных объектов?
3 ответов
когда Django удаляет объект, по умолчанию он эмулирует поведение ограничения SQL на delete CASCADE - другими словами, любые объекты, которые имели внешние ключи, указывающие на объект, который будет удален, будут удалены вместе с ним.
https://docs.djangoproject.com/en/dev/topics/db/queries/#deleting-objects
b = Blog.objects.get(pk=1)
# This will delete the Blog and all of its Entry objects.
b.delete()
Django рекомендует не удалять пользователей, так как внешние ключи сломаются. Именно по этой причине они включили метод is_active.
см https://docs.djangoproject.com/en/1.3/topics/auth/#django.contrib.auth.models.User.is_active
перед удалением исходного объекта необходимо явно удалить все ссылки общего внешнего ключа на исходный объект. Например
Image.objects.filter( object_id=object_to_be_deleted.id,content_type = ContentType.objects.get_for_model(bject_to_be_deleted.get_profile() )).delete()
object_to_be_deleted.delete()
каскадное удаление отлично подходит, когда оно работает, например, для отношений "один к одному" в моделях, но оно не работает для общих отношений внешнего ключа.