Я немного запутался в том, как работает 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»? Все следующие связанные элементы будут удалены:
Излишне говорить, что я не хочу удалить запись Person
или любую из ее потомков!
Думаю, я понимаю логику: поскольку есть значение в поле OneToOne в записи Person, удаление записи User приведет к созданию неверной ссылки в столбце user_id
в базе данных.
Обычно решение состоит в том, чтобы переключить расположение поля OneToOne
. Конечно, это нереально возможно, поскольку объект User
в значительной степени задается django.contrib.auth
.
Есть ли способ предотвратить каскад удаления, сохранив при этом простой способ доступа к человеку от пользователя
? Есть ли способ только сделать это, создав модель пользователя
, которая расширяет версию django.contrib
?
Я изменил названия моделей, чтобы надеюсь, теперь это немного яснее. По сути, это тысячи записей Person. Не у каждого человека есть логин, но если он есть, то у него будет один и только один логин.