Какую опцию 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

Вернуться на верх