Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

471
Visualizações
¿Hay alguna otra opción para on_delete que no sea models.CASCADE para ForeignKey en modelos Django?

¿Por qué la propiedad on_delete de una ForeignKey en un modelo Django no es la predeterminada? Ese debería ser el caso si no hay otra opción que no sean models.CASCADE . ¿Hay alguna otra opción para la propiedad on_delete ?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Sí, hay varios controladores integrados para el parámetro on_delete=… [Django-doc] . La documentación especifica:

  • CASCADE cascada. Django emula el comportamiento de la restricción SQL ON DELETE CASCADE y también elimina el objeto que contiene ForeignKey . (…)

  • PROTECT : evita la eliminación del objeto al que se hace referencia generando ProtectedError , una subclase de django.db.IntegrityError .

  • RESTRICT : evita la eliminación del objeto al que se hace referencia generando RestrictedError (una subclase de django.db.IntegrityError ). A diferencia de PROTECT , se permite la eliminación del objeto al que se hace referencia si también hace referencia a un objeto diferente que se está eliminando en la misma operación, pero a través de una relación CASCADA. (…)

  • SET_NULL : Establecer el ForeignKey null ; esto solo es posible si null es True .

  • SET_DEFAULT : Establece ForeignKey en su valor predeterminado; se debe establecer un default para ForeignKey.

  • SET(…) : establece ForeignKey en el valor pasado a SET() , o si se pasa un invocable, el resultado de llamarlo. (…)

  • DO_NOTHING : No realizar ninguna acción. Si el backend de su base de datos exige integridad referencial, esto provocará un IntegrityError a menos que agregue manualmente una restricción SQL ON DELETE al campo de la base de datos.

Además, también puede escribir su propio controlador para el parámetro on_delete=… . Por ejemplo, en este artículo , analizo la implementación de un controlador que, en cierta medida, es lo mismo que un SET(…) pero el invocable que usa acepta como parámetro el objeto que debe actualizarse.

En los "primeros días", django-1.8 y anteriores, no tenía que establecer un parámetro on_delete=… : CASCADE se usaba como valor predeterminado. Pero esto hace que sea bastante implícito lo que debería suceder en caso de que se elimine el objeto al que se hace referencia, por lo que luego hicieron que el parámetro fuera obligatorio.

over 4 years ago · Santiago Trujillo Relatório

0

Los saqué de la documentación de djangos aquí: https://docs.djangoproject.com/en/4.0/ref/models/fields/#foreignkey

También tienen ejemplos de código.

Los valores posibles para on_delete se encuentran en django.db.models:

CASCADE Elimina en cascada. Django emula el comportamiento de la restricción SQL ON DELETE CASCADE y también elimina el objeto que contiene ForeignKey.

Model.delete() no se llama en modelos relacionados, pero las señales pre_delete y post_delete se envían para todos los objetos eliminados.

PROTEGER Evite la eliminación del objeto al que se hace referencia generando ProtectedError, una subclase de django.db.IntegrityError.

RESTRICT Evite la eliminación del objeto al que se hace referencia generando RestrictedError (una subclase de django.db.IntegrityError). A diferencia de PROTECT, se permite la eliminación del objeto al que se hace referencia si también hace referencia a un objeto diferente que se está eliminando en la misma operación, pero a través de una relación CASCADA.

SET_DEFAULT Establece ForeignKey en su valor predeterminado; se debe establecer un valor predeterminado para ForeignKey.

SET() Establece ForeignKey en el valor pasado a SET(), o si se pasa un invocable, el resultado de llamarlo. En la mayoría de los casos, será necesario pasar un invocable para evitar ejecutar consultas en el momento en que se importe su models.py:

DO_NOTHING No realizar ninguna acción. Si el backend de su base de datos impone la integridad referencial, esto provocará un IntegrityError a menos que agregue manualmente una restricción SQL ON DELETE al campo de la base de datos.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda