Во-первых, чтобы ответить , почему "delete ()" не вызывается из админа . Это утверждение:
- Истинно в случае удаления объектов из списка , т.е. / admin / auth / user / установите флажки, а затем щелкните Действия -> удалить), потому что вызывается метод delete () queryset ,
- Неправильно в случае удаления объекта из change_form , т.е. / admin / auth / user / 1 / нажмите на delete, здесь метод 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)
Вот как я это проверил:
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]: []
Обратите внимание, что из-за каскадного удаления это работает в обоих направлениях:
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 .