2012-01-25 1 views
9

나는 장고 프로젝트를 쓰고있다. 그리고 사용자가 자신의 계정을 삭제 한 후에 알고 싶다면 django가이 사용자와 관련된 모든 객체 (예 : 일부 일반 foreign_key)를 자동으로 삭제하는 방법이 있습니까? 아니면 "post_delete"신호를 사용하여 관련된 모든 객체를 삭제해야합니까?Django 사용자 프로필 및 게시물을 삭제하는 방법과 사용자가 삭제 한 후 모든 할당을 삭제 하시겠습니까?

+0

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

+0

@AdamKG 나는 여기서 GenericForeignKey를 특별히 의미하지는 않는다고 생각한다. 내가 의미하는 바는 이미 대답을 얻은 ON DELETE CASCADE입니다. ContentType만큼, GenericForeignKey가하는 일을 분명히 이해하지 못했습니다. 이 질문과 관련이없는 또 다른 질문이지만, 묻고 싶습니다. 일부 사용자 프로필 구현을 찾았습니다. 이들은 모두 OneToOne 대신 ForeignKey를 사용합니다. 그들은 여기에 다 대일 관계가 있다고 가정하거나 중요하지 않습니다. – Xinghan

답변

5

원래 개체를 삭제하기 전에 명시 적으로 원래의 객체에 대한 일반 외래 키 참조를 모두 삭제해야합니다. 이 모델의 일대일 관계를 예를 들어, 작동하지만 일반적인 외래 키 관계를 작동하지 않을 때 예를 들어

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

계단식 삭제는 중대하다.

+0

대단히 고마워요! – Xinghan

+0

귀하의 권고에 동의하지만, "일반 외래 키 관계에서 작동하지 않는 것"이라는 진술은 일반적인 경우가 아니므로 추가 설명이 필요합니다. – Wtower

+0

@Wtower 이것은 2012 년 (Django 1.4?)에 해당했지만 문서 (https://docs.djangoproject.com/en/1.8/ref/contrib/contenttypes/#reverse-generic-relations)에서 볼 수 있습니다. 이제는 " GenericRelation이있는 객체를 삭제하면 GenericForeignKey가 가리키는 객체도 모두 삭제됩니다.이 객체는 Django 1.7 변경 일 수 있습니다. –

7

외장 키가 손상 될 수 있으므로 Django는 사용자를 삭제하지 않는 것이 좋습니다. 그것은 is_active 메소드가 포함 된 이유입니다.

당신이 관련 개체가 이미 삭제되지 않습니다 확신

+0

대단히 고마워요! – Xinghan

+0

이것은 오래되고 가능한 오래된 제안이며 링크가 깨졌습니다. – Wtower