OneToOneField和删除

时间:2012-10-05 21:06:39

标签: django

我有以下型号:

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管理员删除配置文件时,用户被删除,这是我想要的。如何删除配置文件也会删除用户?

2 个答案:

答案 0 :(得分:49)

由于Profile链接到User,因此它是关系中的依赖模型。因此,删除用户时,将删除所有相关模型。但是,当您删除个人资料时,由于User不依赖于个人资料,因此不会将其删除。

不幸的是,根据on_delete Django docs,没有on_delete规则删除父关系。为此,您可以覆盖Profile的{​​{1}}方法:

delete

然后在做:

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

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

还会删除个人资料的用户。但是,在使用查询集删除配置文件时,不会调用Profile.objects.get(...).delete() 方法(这是在Django Admin中调用的),因为Django使用SQL DELETE批量删除对象:

delete

在这种情况下,根据Django docs的建议,您必须使用Profile.objects.filter(...).delete() 信号(docs)。

post_delete

答案 1 :(得分:8)

使用Profile删除方法上的信号去删除相关用户:

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)