我创建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()"的原因.这句话是:
也就是说,_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的大量文档.
| 归档时间: |
|
| 查看次数: |
4651 次 |
| 最近记录: |