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()

каскадное удаление отлично подходит, когда оно работает, например, для отношений "один к одному" в моделях, но оно не работает для общих отношений внешнего ключа.