Какую опцию on_delete использовать в приложении django?
У меня есть модель Article, которая позволяет администраторам публиковать статьи. Каждая статья назначается пользователю, который создает эту статью.
Я хочу быть уверенным, что все статьи останутся нетронутыми, даже если я удалю автора этой конкретной статьи. Я выбрал on_delete=models.DO_NOTHING, чтобы быть уверенным, что ничего, кроме учетной записи пользователя, не будет удалено, но я не совсем уверен, что это самый эффективный способ.
class Article(models.Model):
id = models.AutoField(primary_key=True)
author = models.ForeignKey(User, blank=True, null=True, on_delete=models.DO_NOTHING)
title = models.CharField('Title', max_length=70, help_text='max 70 characters')
body = models.TextField('Description')
Вопрос
Следует ли мне использовать другой вариант или DO_NOTHING вполне подойдет. Очевидно, для меня наиболее важным является то, что имя автора будет видно в статье после удаления, а сама статья не может быть удалена.
В основном таблица базы данных создает запись в определенной таблице и хранит информацию о пользователе, как я вижу, вы связываете модель статьи с пользователем, основываясь на модели User.
Могут быть два случая, например, если вы хотите, чтобы статья оставалась в базе данных, даже если вы удалите автора, вы получите статью, когда она будет где-то отображаться.
Если вы делаете Cascade delete, это удаляет запись статьи, когда связанный автор удаляется.
Если вы сделаете models.Protect вы не получите доступ к удалению статьи, когда ваш пользователь будет удален.
приходить к самому models.Do nothing - плохая идея, поскольку это создаст проблемы целостности в вашей базе данных (ссылка на объект, которого на самом деле не существует). SQL-эквивалент: НЕТ ДЕЙСТВИЯ
найти больше здесь.
Самое лучшее, что я могу сказать:
добавьте еще одно поле под названием author_name.
теперь установите on_delete вашего автора на models.SET_NULL.
Добавьте пользовательский метод сохранения для добавления имени пользователя в author_name.
Добавьте свойство к вашей модели с именем author_full_name.
в этом свойстве проверьте, не является ли автор null, верните имя и фамилию пользователя.
если автор None возвращает author_name.
Таким образом, при сохранении статьи полное имя пользователя сохраняется в author_name. а если пользователь удален, вы можете использовать author_name.
Но будьте осторожны с пользовательским методом сохранения, он может добавить некоторые проблемы, если вы не проверите пользователя и его удаление.
Edit: Другое решение
Если у вас есть пользовательская модель пользователя, вы можете ввести поле для пользователей под названием is_deleted.
После того, как пользователи удалят свои аккаунты, просто установите это поле в True, и логика в вашем приложении будет исключать удаленные аккаунты.
Таким образом, ваши пользователи не будут доступны никому, но вы сможете использовать их для статей и внешних ключей. (не забудьте сказать пользователям, что удаление учетных записей работает таким образом, или поставьте задачу удалять учетные записи через некоторое время и установите поле, о котором я говорил выше)
Вам просто нужно использовать CASCADE, как показано ниже: on_delete=models.CASCADE