Função do parâmetro On_delete em modelos Django

Vaibhav Vaibhav 12 abril 2022
  1. Argumento CASCADE
  2. Argumento PROTECT
  3. Argumento RESTRICT
  4. Argumento SET_NULL
  5. Argumento SET_DEFAULT
  6. Argumento SET()
  7. Argumento DO_NOTHING
Função do parâmetro On_delete em modelos Django

Modelos Django simplificam o banco de dados e a criação de tabelas, adicionando novos dados ou tuplas às tabelas, excluindo, recuperando e modificando. Com modelos Django, podemos facilmente configurar relacionamentos entre tabelas com a ajuda de chaves estrangeiras.

Ao configurar relacionamentos, temos que definir valores para alguns parâmetros. Um desses parâmetros é o on_delete. O parâmetro on_delete é usado para configurar o comportamento que deve ser adotado quando um objeto referenciado é excluído. É basicamente usado para definir como os efeitos da exclusão de um objeto referenciado serão tratados.

Existem sete comportamentos ou ações possíveis para os quais o parâmetro on_delete pode ser configurado. Falaremos sobre todos eles individualmente.

Argumento CASCADE

O comportamento em cascata geralmente é usado ao configurar relacionamentos entre modelos. Quando um objeto referenciado é excluído, todos os objetos que fazem referência a esse objeto referenciado também são excluídos.

Sintaxe

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

Para entender um pouco melhor, considere o seguinte exemplo. Observe que o mesmo exemplo será usado para explicar alguns outros comportamentos também.

Existe um site onde os autores podem se registrar e escrever blogs no site. Agora para representar as duas entidades, considere dois modelos, nomeadamente, Author e Blog. Todas as entradas ou tuplas em Blog têm uma referência de chave estrangeira (ou fazem referência) a uma entrada ou tupla de Author. Representa uma relação em que todo blog já escrito pertence a um autor que o escreveu.

Agora, digamos que o site tenha uma política de que se um autor excluir sua conta, todos os blogs já escritos por ele serão removidos. Nesse cenário, um relacionamento em cascata será uma escolha adequada.

Argumento PROTECT

O argumento PROTECT evita a exclusão do objeto referenciado se houver objetos referenciando este objeto. Em outras palavras, o objeto referenciado não pode ser excluído enquanto os objetos que fazem referência a ele existirem. Os objetos de referência devem ser excluídos manualmente antes de excluir o objeto referenciado. A exclusão é evitada levantando um ProtectedError.

Esse relacionamento pode ser usado em locais onde os dados são muito importantes e confidenciais e você não pode se dar ao luxo de perdê-los com o manuseio adequado. Ou quando os objetos de referência também estão sendo usados ​​em outro lugar e não podem ser excluídos sem a validação e o tratamento adequados.

Argumento RESTRICT

RESTRICT é semelhante a PROTECT. Também evita a exclusão de objetos referenciados e gera um RestrictedError. Mas há uma ligeira diferença entre os dois. Ao contrário de PROTECT, se o objeto referenciado está referenciando algum outro objeto é um relacionamento CASCADE, e também está sendo excluído, então a exclusão é permitida. Em outras palavras, a exclusão do objeto referenciado é permitida se os objetos referenciados e o objeto referenciado referirem algum outro objeto comum em um relacionamento CASCADE.

Considere o seguinte exemplo.

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)

Se tentarmos deletar um objeto Album, RestrictedError será gerado. Mas se tentarmos excluir um objeto Artist, a exclusão será bem-sucedida, visto que as músicas que fazem referência a um objeto Album também fazem referência ao objeto Artist referido pelo objeto Album em um relationship CASCADE.

Argumento SET_NULL

No caso de SET_NULL, como o nome sugere, quando um objeto referenciado é excluído, o objeto referenciado para todos os objetos referenciados é definido como NULL. Este relacionamento requer que o campo do objeto referenciado seja anulável.

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

Por exemplo, se o site tem uma política que determina que se um autor sai, então seus blogs não serão excluídos. Em vez disso, o autor de todos os blogs será definido como um autor anônimo ou None.

Argumento SET_DEFAULT

No caso de SET_DEFAULT, quando um objeto referenciado é excluído, então o objeto referenciado para todos os objetos referenciados é definido com um valor padrão. Este valor padrão pode ser NULL, bem como algum outro modelo ou tabela Django. Este relacionamento requer que o campo do objeto referenciado seja anulável no caso de NULL.

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

Por exemplo, se o site tem uma política de saída de um autor, o autor de todos os seus blogs será o administrador ou a própria empresa. Nesses casos, SET_DEFAULT seria a escolha certa.

Argumento SET()

SET() é exatamente igual a SET_DEFAULT. Ele pode aceitar modelos ou tabelas Django também. A única diferença é que em SET(), podemos passar um callable, que será chamado para todos os objetos referenciados se o objeto referenciado for deletado.

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

A função que pode ser chamada, junto com um modelo, seria algo assim.

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))

Argumento DO_NOTHING

DO_NOTHING é uma relação um pouco arriscada que pode existir entre dois modelos. Como o nome sugere, quando um objeto referenciado é excluído, o objeto referenciado não será alterado para todos os objetos referenciados. Em outras palavras, nada será feito para lidar com os efeitos da exclusão.

Este é um comportamento muito arriscado, pois pode causar problemas de integridade porque o objeto referenciado é excluído, mas os objetos de referência ainda estão fazendo referência a ele.

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.

Artigo relacionado - Django Model