2012-10-05 2 views
28

나는 다음과 같은 모델이 있습니다OneToOneField 및 삭제

from django.db import models 
from django.contrib.auth.models import User 


class Profile(models.Model): 
    user = models.OneToOneField(User) 
    # ... 

    def __unicode__(self): 
     return u'%s %s' % (self.user.first_name, self.user.last_name) 

사용자를 삭제하는 장고 관리자를 사용하여 프로필도 삭제됩니다, 내가 원하는 것입니다. 그러나 Django 관리자를 사용하여 프로필을 삭제할 때 이 아닌 이 아니며이 삭제되었습니다. 프로필을 삭제해도 사용자가 삭제되도록하려면 어떻게해야합니까?

답변

41

Profile 이후 링크, 그것은 관계에 종속 모델입니다. 따라서 사용자를 삭제하면 모든 종속 모델이 삭제됩니다. 그러나 프로필을 삭제하면 User은 프로필에 종속되지 않으므로 제거되지 않습니다.

불행히도, on_delete Django docs에 따르면, 부모 관계를 삭제하는 on_delete 규칙이 없습니다. 수행 할 때 다음

class Profile(models.Model): 
    # ... 

    def delete(self, *args, **kwargs): 
     self.user.delete() 
     return super(self.__class__, self).delete(*args, **kwargs) 

: 그렇게하기 위해서는, 당신은 Profiledelete 방법을 덮어 쓸 수

Profile.objects.get(...).delete() 

은 프로파일의 사용자를 삭제합니다. 그 이후 (장고 관리자 무엇이라고한다) 검색어 세트를 사용하여 프로파일을 삭제할 때 delete 메서드가 호출되지 않습니다하지만 장고는 SQL 대량의 개체를 삭제하려면 삭제를 사용합니다 :이 경우

Profile.objects.filter(...).delete() 

, 장고 권장 docs이면 post_delete 신호 (docs)를 사용해야합니다.

from django.dispatch import receiver 
from django.db.models.signals import post_delete 

@receiver(post_delete, sender=Profile) 
def post_delete_user(sender, instance, *args, **kwargs): 
    if instance.user: # just in case user is not specified 
     instance.user.delete() 
+0

대단히 감사합니다! 나는 Django에서 새로운 것이므로 다른 Django 놈들이 이것을 발견 할 경우 @receiver 데코레이터에 dispatch_uid를 추가하여 작동되도록해야한다. 그러나 그 후, 그것은 훌륭하게 작동했습니다! – Nick

7

는 사용 가서 관련 사용자를 삭제하는 Profile의 삭제 방법에 대한 신호 : User

from django.db.models.signals import post_delete 

def delete_related_user(sender, **kwargs): 
    deleted_profile = kwargs['instance'] 
    deleted_profile.user.delete() 

post_delete.connect(delete_related_user, sender=Profile) 
+0

답장을 보내 주셔서 감사합니다. 조금 더 완전하고 조금 더 작아서 miki725의 답변으로 끝났습니다. 그래도 정말 고마워! – Nick