gpt4 book ai didi

python - 删除 UserProfile 时删除用户

转载 作者:太空狗 更新时间:2023-10-30 00:37:04 24 4
gpt4 key购买 nike

我创建了 UserProfile(从 User 扩展)并写入 settings.py

 AUTH_PROFILE_MODULE = 'mainapp.UserProfile'.

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

我尝试删除用户,以便 self.user.delete(),但方法 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)

最佳答案

首先,回答为什么不从管理员调用“delete()”。这个声明是:

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

也就是说,_delete signals得到很好的支持。以下是您可以如何使用它:

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)

我是这样测试的:

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]: []

当然,这在调用对象的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]: []

请注意,由于 cascade 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]: user.delete()

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

In [6]: UserProfile.objects.all()
Out[6]: []

如果您需要了解更多有关信号的信息,请参阅 Django's extensive documentation .

关于python - 删除 UserProfile 时删除用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9363128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com