Удалите 2 модели различных объектов, которые ссылаются друг на друга как внешние ключи

#python #django #database #postgresql #foreign-keys

#питон #джанго #База данных #postgresql #внешние ключи

Вопрос:

У нас есть две модели Django:

 class Project(models.Model):  project_title = models.CharField(max_length=30)  owner = models.ForeignKey(User, null=True, on_delete=models.DO_NOTHING)  class User(models.Model):  usernmae = models.CharField(max_length=50)  active_project = models.ForeignKey(User, null=True, on_delete=models.DO_NOTHING, related_name='current_project')  

У меня есть пользователь с объектом (с id say 692 ). И этот пользователь создал проект с id=12345 помощью , поэтому на эти owner поля будут ссылаться именно на это. Я хочу удалить этого пользователя. Но это показывает ошибку, что

 delete on table "app_user" violates foreign key constraint  

Это ожидается , как on_delete=models.DO_NOTHING и было установлено. Один из способов, который я обнаружил, — это использование on_delete=models.CASCADE .

Вопрос: Как мне удалить пользователя ( 692 ) без изменения определения модели(необходимости повторного запуска миграции)? Выполнение этого вручную, сначала удалив проект, приводит к той же foreign-key ошибке, что owner и поле User «объект». Как справиться с этой взаимной связью внешнего ключа при удалении, поскольку удаление любого из этих двух приводит к исключению внешнего ключа?

Обновите Некоторые исправления в определении модели username -это имя поля вместо usernmae (опечатка). И внешний ключ для проекта-это Project не User модель.

 class Project(models.Model):  project_title = models.CharField(max_length=30)  owner = models.ForeignKey(User, null=True, on_delete=models.DO_NOTHING)  class User(models.Model):  username = models.CharField(max_length=50)  active_project = models.ForeignKey(Project, null=True, on_delete=models.DO_NOTHING, related_name='current_project')  

Комментарии:

1. Вероятно, лучший способ-это сделать это в транзакции. Альтернативой может быть сначала установить одно из двух ForeignKey значений «s NULL «.

2. В классе USER это действительно usernmae не username так ? Что еще более важно, почему не включен active_project FK User Project ? Добавьте ответы в качестве обновления к вашему вопросу.

Ответ №1:

ЕСЛИ вы действительно не хотите выполнять миграцию (по какой-либо конкретной причине?) и если на этот раз вы не против сделать это вручную. Тогда у вас есть два варианта:

  1. Зайдите в панель администратора и вручную измените User поле в project экземпляре на другого пользователя или на NULL. Теперь вы должны иметь возможность удалить User экземпляр, так как он больше не упоминается в проекте.
  2. Если это сработало, вы также можете удалить instane проекта.

Любопытно, если это сработает, дайте мне знать!