我有以下型号:
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管理员删除配置文件时,用户不被删除,这是不我想要的。如何删除配置文件也会删除用户?
答案 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)