2012-10-05 5 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の管理を使用して、プロファイルが同様に削除される、私が欲しいものです。しかし、Djangoの管理者を使用してプロファイルを削除すると、ユーザはではなくであり、ではなく、が削除されます。プロファイルを削除するとユーザーも削除されるようにするにはどうすればよいですか?

答えて

41

を、それが関係に依存したモデルです。したがって、ユーザーを削除すると、すべての従属モデルが削除されます。ただし、プロファイルを削除すると、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メソッドが呼び出されることはありませんしかし、Djangoは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のnoobがこれを見つけた場合は、@receiverデコレータにdispatch_uidを追加して動作させる必要がありました。しかし、その後、それは素晴らしい仕事をした! – Nick

7

関連するユーザーに行くと削除にProfileのdeleteメソッド上の信号を使用します。UserProfileのリンクので

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