删除UserProfile时删除用户

yAn*_*Tar 5 python django

我创建UserProfile(从用户扩展)并写入settings.py

 AUTH_PROFILE_MODULE = 'mainapp.UserProfile'.
Run Code Online (Sandbox Code Playgroud)

当我删除UserProfile(从管理区域)我也会删除User项目.

我尝试删除用户self.user.delete(),但方法删除(在UserProfile中)不调用.为什么?

这是我的代码:

class UserProfile(models.Model):
    avatar = models.ImageField(upload_to = settings.PATH_AVATARS, blank=True)
    url = models.URLField(blank=True)
    user = models.OneToOneField(User)

    def __unicode__(self):
        return self.user.username

    def delete(self, *args, **kwargs):
        self.user.delete()
        super(UserProfile, self).delete(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

jpi*_*pic 11

首先,回答为什么不从管理员调用"delete()"的原因.这句话是:

  1. 在从列表视图中删除对象的情况下为True,即./ admin/auth/user /选中一些框然后单击Actions - > delete),这是因为调用了queryset的delete()方法,
  2. 在从change_form中删除对象的情况下,即错误./ admin/auth/user/1 /点击删除,这是调用对象的delete()方法的地方

也就是说,_delete信号得到了很好的支持.以下是如何使用它:

from django.db.models import signals

def delete_user(sender, instance=None, **kwargs):
    try:
        instance.user
    except User.DoesNotExist:
        pass
    else:
        instance.user.delete()
signals.post_delete.connect(delete_user, sender=UserProfile)
Run Code Online (Sandbox Code Playgroud)

这是我测试它的方式:

In [1]: from django.contrib.auth.models import User; from testapp.models import UserProfile; User.objects.all().delete(); UserProfile.objects.all().delete()

In [2]: user=User(username='foo'); user.save()

In [3]: profile=UserProfile(user=user); profile.save()

In [4]: UserProfile.objects.all().delete()

In [5]: User.objects.all()
Out[5]: []
Run Code Online (Sandbox Code Playgroud)

当然,这在调用对象的delete()方法时也有效:

In [1]: from django.contrib.auth.models import User; from testapp.models import UserProfile; User.objects.all().delete(); UserProfile.objects.all().delete()

In [2]: user=User(username='foo'); user.save()

In [3]: profile=UserProfile(user=user); profile.save()

In [4]: profile.delete()

In [5]: User.objects.all()
Out[5]: []
Run Code Online (Sandbox Code Playgroud)

请注意,由于级联删除,这两种方式都有效:

In [1]: from django.contrib.auth.models import User; from testapp.models import UserProfile; User.objects.all().delete(); UserProfile.objects.all().delete()

In [2]: user=User(username='foo'); user.save()

In [3]: profile=UserProfile(user=user); profile.save()

In [4]: user.delete()

In [5]: User.objects.all()
Out[5]: []

In [6]: UserProfile.objects.all()
Out[6]: []
Run Code Online (Sandbox Code Playgroud)

如果您需要了解有关信号的更多信息,请参阅Django的大量文档.