Удалить пользователя при удалении UserProfile - PullRequest
5 голосов
/ 20 февраля 2012

Я создал UserProfile (расширяется от пользователя) и записан в 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)

1 Ответ

11 голосов
/ 20 февраля 2012

Во-первых, чтобы ответить , почему "delete ()" не вызывается из админа . Это утверждение:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...