#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
значений «sNULL
«.2. В классе
USER
это действительноusernmae
неusername
так ? Что еще более важно, почему не включенactive_project
FKUser
Project
? Добавьте ответы в качестве обновления к вашему вопросу.
Ответ №1:
ЕСЛИ вы действительно не хотите выполнять миграцию (по какой-либо конкретной причине?) и если на этот раз вы не против сделать это вручную. Тогда у вас есть два варианта:
- Зайдите в панель администратора и вручную измените
User
поле вproject
экземпляре на другого пользователя или на NULL. Теперь вы должны иметь возможность удалитьUser
экземпляр, так как он больше не упоминается в проекте. - Если это сработало, вы также можете удалить instane проекта.
Любопытно, если это сработает, дайте мне знать!