Связь OneToOne с моделью пользователя (django.contrib.auth) без каскадного удаления

Я немного запутался в том, как работает OneToOneField, когда в игру вступает удаление. Единственная полуавторитетная информация, которую я могу найти, - это эта ветка на django-developers :

Я не знаю, обнаружили ли вы это еще, но удаление работает в в одном направлении, но не в том направлении, которого вы ожидаете. Для Например, используя модели, которые вы разместили в другом сообщении:

 class Place (models.Model):
  name = models.CharField (max_length = 100)
класс Ресторан (models.Model):
  place = models.OneToOneField (Место, primary_key = True)
 

Если вы создать место и связанный с ним ресторан, удалив Ресторан не удалит это место (проблема в том, что вы отчет здесь), но удаление места приведет к удалению ресторана.

У меня следующая модель:

class Person(models.Model):
    name = models.CharField(max_length=50)
    # ... etc ...
    user = models.OneToOneField(User, related_name="person", null=True, blank=True)

Она настроена таким образом, что я могу легко получить доступ к человеку от пользователя ] с использованием user.person .

Однако, когда я пытаюсь удалить запись User в админке, естественно, она каскадно возвращается в мою модель Person , точно так же, как обсуждалось в ветке, показывая что-то вроде:

Вы уверены, что хотите удалить пользователя «JordanReiter2»? Все следующие связанные элементы будут удалены:

  • Пользователь: JordanReiter
    • Человек: Джордан Рейтер
      • Представление: Заголовок1
      • Представление: Заголовок2

Излишне говорить, что я не хочу удалить запись Person или любую из ее потомков!

Думаю, я понимаю логику: поскольку есть значение в поле OneToOne в записи Person, удаление записи User приведет к созданию неверной ссылки в столбце user_id в базе данных.

Обычно решение состоит в том, чтобы переключить расположение поля OneToOne . Конечно, это нереально возможно, поскольку объект User в значительной степени задается django.contrib.auth .

Есть ли способ предотвратить каскад удаления, сохранив при этом простой способ доступа к человеку от пользователя ? Есть ли способ только сделать это, создав модель пользователя , которая расширяет версию django.contrib ?

Обновление

Я изменил названия моделей, чтобы надеюсь, теперь это немного яснее. По сути, это тысячи записей Person. Не у каждого человека есть логин, но если он есть, то у него будет один и только один логин.

6
задан Brian Tompsett - 汤莱恩 10 August 2015 в 22:31
поделиться