Я немного смущен тем, как работает OneToOneField, когда в игру вступает удаление. Единственная квазиавторитетная информация, которую я могу найти, находится в этой ветке на django-developers. а>:
Я не знаю, обнаружили ли вы это еще, но удаление работает в одном направлении, но не в том направлении, в котором вы ожидаете. Например, используя модели, которые вы разместили в другом сообщении:
class Place(models.Model): name = models.CharField(max_length = 100) class Restaurant(models.Model): place = models.OneToOneField(Place, 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)
Он настроен таким образом, что я могу легко получить доступ к person
из экземпляра User
, используя user.person
.
Однако, когда я пытаюсь удалить запись User
в admin, естественно, она каскадируется обратно к моей модели Person
, как обсуждалось в ветке, показывая что-то вроде:
Вы уверены, что хотите удалить пользователя "JordanReiter2"? Все следующие связанные элементы будут удалены:
- User: JordanReiter
- Person: JordanReiter
- Submission: Title1
- Представление: Title2
- Person: JordanReiter
Излишне говорить, что я не хочу удалять запись Person
или любые ее потомки!
Думаю, я понимаю логику: поскольку в поле OneToOne в записи Person есть значение, удаление записи User создаст неверную ссылку в столбце user_id
в базе данных.
Обычно решением было бы переключить, где находится поле OneToOne
. Конечно, на самом деле это невозможно, так как объект User
в значительной степени задается django.contrib.auth
.
Есть ли способ предотвратить каскадное удаление, сохраняя при этом прямой доступ к человеку из user
? Является ли единственным способом создать модель User
, расширяющую версию django.contrib
?
Обновлять
Я изменил названия моделей, так что, надеюсь, теперь это немного понятнее. По сути, там тысячи записей о людях. Не у каждого человека есть логин, но если он есть, то у него один и только один логин.