나는 장고 프로젝트를 쓰고있다. 그리고 사용자가 자신의 계정을 삭제 한 후에 알고 싶다면 django가이 사용자와 관련된 모든 객체 (예 : 일부 일반 foreign_key)를 자동으로 삭제하는 방법이 있습니까? 아니면 "post_delete"신호를 사용하여 관련된 모든 객체를 삭제해야합니까?Django 사용자 프로필 및 게시물을 삭제하는 방법과 사용자가 삭제 한 후 모든 할당을 삭제 하시겠습니까?
답변
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()
대단히 감사합니다! – Xinghan
원래 개체를 삭제하기 전에 명시 적으로 원래의 객체에 대한 일반 외래 키 참조를 모두 삭제해야합니다. 이 모델의 일대일 관계를 예를 들어, 작동하지만 일반적인 외래 키 관계를 작동하지 않을 때 예를 들어
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()
계단식 삭제는 중대하다.
대단히 고마워요! – Xinghan
귀하의 권고에 동의하지만, "일반 외래 키 관계에서 작동하지 않는 것"이라는 진술은 일반적인 경우가 아니므로 추가 설명이 필요합니다. – Wtower
@Wtower 이것은 2012 년 (Django 1.4?)에 해당했지만 문서 (https://docs.djangoproject.com/en/1.8/ref/contrib/contenttypes/#reverse-generic-relations)에서 볼 수 있습니다. 이제는 " GenericRelation이있는 객체를 삭제하면 GenericForeignKey가 가리키는 객체도 모두 삭제됩니다.이 객체는 Django 1.7 변경 일 수 있습니다. –
https://docs.djangoproject.com/en/1.3/topics/auth/#django.contrib.auth.models.User.is_active를 참조하십시오? IntegrityError를 피하기 위해 Null을 허용하지 않는 ForeignKeys를 삭제해야하며, IIRC Django는 기본적으로이를 수행합니다. 일반적인 외래 키로 [GenericForeignKey] (https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.generic.GenericForeignKey)를 구체적으로 의미합니까? 왜냐하면 그것은 더 복잡해지기 때문입니다. – AdamKG
@AdamKG 나는 여기서 GenericForeignKey를 특별히 의미하지는 않는다고 생각한다. 내가 의미하는 바는 이미 대답을 얻은 ON DELETE CASCADE입니다. ContentType만큼, GenericForeignKey가하는 일을 분명히 이해하지 못했습니다. 이 질문과 관련이없는 또 다른 질문이지만, 묻고 싶습니다. 일부 사용자 프로필 구현을 찾았습니다. 이들은 모두 OneToOne 대신 ForeignKey를 사용합니다. 그들은 여기에 다 대일 관계가 있다고 가정하거나 중요하지 않습니다. – Xinghan