Функция параметра On_delete в моделях Django

Функция параметра On_delete в моделях Django

Vaibhav Vaibhav Apr-12, 2022 Jun-29, 2021 Django Django Model
  1. Аргумент CASCADE
  2. Аргумент PROTECT
  3. Аргумент RESTRICT
  4. Аргумент SET_NULL
  5. Аргумент SET_DEFAULT
  6. SET() аргумент
  7. Аргумент DO_NOTHING

Модели Django упрощают создание базы данных и таблиц, добавляя новые данные или кортежи в таблицы, удаляя, извлекая и изменяя. С моделями Django мы можем легко установить отношения между таблицами с помощью внешних ключей.

При настройке отношений мы должны установить значения для нескольких параметров. Один из таких параметров - on_delete. Параметр on_delete используется для настройки поведения, которое должно быть принято при удалении указанного объекта. Он в основном используется для определения того, как будут обрабатываться эффекты удаления объекта, на который имеется ссылка.

Существует семь возможных вариантов поведения или действий, для которых можно настроить параметр on_delete. Поговорим обо всех по отдельности.

Аргумент CASCADE

Каскадное поведение обычно используется при настройке отношений между моделями. Когда объект, на который имеется ссылка, удаляется, все объекты, ссылающиеся на этот объект, также будут удалены.

Синтаксис

XYZ = models.ForeignKey(WASD, on_delete = models.CASCADE)

Чтобы лучше понять это, рассмотрим следующий пример. Обратите внимание, что тот же пример будет использован для объяснения некоторых других вариантов поведения.

Есть веб-сайт, на котором авторы могут зарегистрироваться и вести блог на сайте. Теперь представим две сущности, рассмотрим две модели, а именно Author и Blog. Все записи или кортежи в Blog имеют ссылку по внешнему ключу (или ссылаются) на запись или кортеж Author. Он представляет собой отношения, согласно которым каждый когда-либо написанный блог принадлежит автору, который его написал.

Теперь предположим, что на веб-сайте существует политика, согласно которой, если автор удаляет свою учетную запись, все блоги, когда-либо написанные им или ею, будут удалены. В таком сценарии удачным выбором будут каскадные отношения.

Аргумент PROTECT

Аргумент PROTECT предотвращает удаление указанного объекта, если есть объекты, ссылающиеся на этот объект. Другими словами, объект, на который имеется ссылка, не может быть удален, пока существуют объекты, ссылающиеся на него. Ссылочные объекты должны быть удалены вручную перед удалением ссылочного объекта. Удаление предотвращается путем выдачи ProtectedError.

Эта связь может использоваться в местах, где данные очень важны и конфиденциальны, и вы не можете позволить себе потерять их при правильной обработке. Или когда ссылающиеся объекты также используются где-то еще, и их нельзя удалить без надлежащей проверки и обработки.

Аргумент RESTRICT

RESTRICT похож на PROTECT. Он также предотвращает удаление объектов, на которые имеются ссылки, и вызывает исключение RestrictedError. Но между ними есть небольшая разница. В отличие от PROTECT, если объект, на который имеется ссылка, ссылается на какой-то другой объект, является отношением CASCADE, и он также удаляется, то удаление разрешено. Другими словами, удаление ссылочного объекта разрешено, если ссылающиеся объекты и ссылочный объект ссылаются на какой-либо другой общий объект в связи CASCADE.

Рассмотрим следующий пример.

class Artist(models.Model):
    name = models.CharField(max_length = 100)

class Album(models.Model):
    artist = models.ForeignKey(Artist, on_delete = models.CASCADE)

class Song(models.Model):
    artist = models.ForeignKey(Artist, on_delete = models.CASCADE)
    album = models.ForeignKey(Album, on_delete = models.RESTRICT)

Если мы попытаемся удалить объект Album, возникнет RestrictedError. Но если мы попытаемся удалить объект Artist, то удаление будет успешным, поскольку песни, ссылающиеся на объект Album, также ссылаются на объект Artist, на который ссылается объект Album в relationship CASCADE.

Аргумент SET_NULL

В случае SET_NULL, как следует из названия, когда объект, на который указывает ссылка, удаляется, то объект, на который указывает ссылка, для всех объектов ссылки устанавливается в NULL. Эта связь требует, чтобы поле объекта, на которое указывает ссылка, допускало значение NULL.

XYZ = models.ForeignKey(WASD, on_delete = models.SET_NULL, null = True)

Например, если на веб-сайте действует политика, согласно которой, если автор уходит, его / ее блоги будут удалены. Вместо этого автором для всех блогов будет анонимный автор или None.

Аргумент SET_DEFAULT

В случае SET_DEFAULT, когда объект ссылки удаляется, тогда объект ссылки для всех объектов ссылки устанавливается в значение по умолчанию. Это значение по умолчанию может быть NULL, а также для некоторых других моделей или таблиц Django. Эта связь требует, чтобы поле объекта, на которое указывает ссылка, допускало значение NULL в случае NULL.

XYZ = models.ForeignKey(WASD, on_delete = models.SET_DEFAULT, null = True, default = QWERTY)

Например, если на веб-сайте действует политика, согласно которой в случае ухода автора автором всех его блогов будет администратор или сама компания. В таких случаях SET_DEFAULT будет правильным выбором.

SET() аргумент

SET () точно такой же, как SET_DEFAULT. Он также может принимать модели или таблицы Django. Единственное отличие состоит в том, что в SET() мы можем передать вызываемый объект, который будет вызываться для всех ссылающихся объектов, если указанный объект будет удален.

XYZ = models.ForeignKey(WASD, on_delete = models.SET(...), null = True)

Вызываемая функция вместе с моделью будет выглядеть примерно так.

def getUser():
    """Callable function
    """
    return User.objects.get_or_create(username = "anonymous")[0]

class Author(models.Model):
    user = models.ForeignKey(User, on_delete = models.SET(getUser))

Аргумент DO_NOTHING

DO_NOTHING - это несколько рискованная взаимосвязь, которая может существовать между двумя моделями. Как следует из названия, когда объект, на который имеется ссылка, удален, объект, на который указывает ссылка, не будет изменен для всех объектов ссылки. Другими словами, ничего не будет сделано для обработки последствий удаления.

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

XYZ = models.ForeignKey(WASD, on_delete = models.DO_NOTHING)
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

LinkedIn GitHub

Сопутствующая статья - Django Model

  • Мета-класс в моделях Django
  • Удалить запись модели в Django