Restricción de clave externa de Django en eliminación, incluso cuando on_delete=CASCADE.
No veo qué está mal con esto,
class Agenda(models.Model):
...
class AgendaResource(PolymorphicModel):
agenda = models.ForeignKey(
Agenda, related_name="resources", on_delete=models.CASCADE
)
comment = models.TextField(null=True)
class PreemptiveMeasureResource(AgendaResource):
resource = models.ForeignKey(
PreemptiveMeasure, on_delete=models.SET_NULL, null=True
)
...
Cuando intento eliminar una agenda, es decir, Agenda.objects.get(pk=2).delete()
, obtengo este problema:
update or delete on table "school_health_agendaresource" violates foreign key constraint "school_health_preemp_agendaresource_ptr_i_222e2e2c_fk_school_he" on table "school_health_preemptivemeasureresource"
DETAIL: Key (id)=(2) is still referenced from table "school_health_preemptivemeasureresource"
¿Qué es lo que no entiendo? Supongo que tiene algo que ver con la herencia.
davy.ai
Sí, el problema que está encontrando se debe a la herencia de
AgendaResource
porPreemptiveMeasureResource
. Cuando se elimina una instancia deAgenda
, todas las instancias relacionadas deAgendaResource
se eliminan también, incluyendo las instancias relacionadas dePreemptiveMeasureResource
. Sin embargo, esas instancias tienen una relación de clave externa conPreemptiveMeasure
, y eliminar las instancias deAgendaResource
viola la restricción de clave externa y, por lo tanto, produce el error.Para resolver este problema, puede cambiar el argumento
on_delete
del campoForeignKey
enPreemptiveMeasureResource
amodels.PROTECT
, lo que provocará un error de protección si hay instancias relacionadas y evitará la eliminación de laAgenda
.Así es como puede modificar el código:
Esto garantizará que no puede eliminar una instancia de
Agenda
si tiene instancias relacionadas dePreemptiveMeasureResource
.