Django, как удалить профиль пользователя и сообщения и все ассоциации после того, как пользователь удалил? - PullRequest
9 голосов
/ 26 января 2012

Я пишу проект Django.И хотите знать, после того, как пользователь удалит свою учетную запись, есть ли способ встроить в django автоматическое удаление всех объектов, связанных с этим пользователем (например, какой-то общий foreign_key)?Или я должен использовать сигнал "post_delete", чтобы удалить все связанные объекты?

Ответы [ 3 ]

13 голосов
/ 26 января 2012

Когда Django удаляет объект, по умолчанию он эмулирует поведение ограничения SQL ON 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()
7 голосов
/ 26 января 2012

Django рекомендует не удалять пользователей, так как внешние ключи сломаются.Именно по этой причине они включили метод is_active.

См. https://docs.djangoproject.com/en/1.3/topics/auth/#django.contrib.auth.models.User.is_active

5 голосов
/ 26 января 2012

Вы должны явно удалить все общие ссылки внешнего ключа на исходный объект, прежде чем удалять исходный объект. Например

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

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

...