Невозможно удалить некоторые экземпляры модели из-за FK - PullRequest
0 голосов
/ 19 сентября 2019

Python 3.6 и Django 1.11.7.

У меня две модели выглядят следующим образом:

class User():
    name = models.CharField()
    ...

class UserInfo():
   user = models.OneToOneField(User, on_delete=models.PROTECT, primary_key=True, related_name='info')

Я хотел удалить какой-то пользовательский экземплярA, и я явно удалил информацию пользователя A.Но когда я попытался удалить пользовательскую модель user.delete(), я получил ProtecedError:

ProtectedError: ("Cannot delete some instances of model 'User' because they are referenced through a protected foreign key: 'UserInfo.user'", <QuerySet [<UserInfo: UserInfo object>]>)

Затем я попытался поместить удаление внутрь try / catch, выглядит следующим образом:

try:
    user.delete()
except ProtectedError:
    UserInfo.objects.filter(user=user).delete()
    user.delete()

Но все же получил то же исключение.Что могло пойти не так в моей работе?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Удалите on_delete=models.PROTECT из поля user.И запустить поля manage.py makemigrations

ForeignKey по умолчанию CASCADE для аргумента on_delete.Это означает, что удаление объекта пользователя будет каскадно, а также удалит объект userinfo, связанный с этим пользователем.

Похоже, это поведение, которое вы ищете.

Вы можете узнать больше об этомв документации документация

Также обратите внимание, что on_delete имеет значение по умолчанию fo CASCADE, этот аргумент потребуется для Django 2.0.

0 голосов
/ 19 сентября 2019

Вы используете пункт защиты для связанных объектов:

on_delete=models.PROTECT

Вы можете проверить это в документации по:

https://docs.djangoproject.com/en/2.2/ref/models/fields/#django.db.models.ForeignKey.on_delete

У вас естьздесь указано:

PROTECT [источник] Предотвратить удаление объекта, на который есть ссылка, путем вызова ProtectedError, подкласса django.db.IntegrityError.

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