modelos de Django en general, manejan el comportamiento ON DELETE CASCADE muy adecuadamente (de una manera que trabaja en las bases de datos que no son compatibles de forma nativa.)¿Cuáles son las opciones para anular el comportamiento de eliminación en cascada de Django?
Sin embargo, estoy luchando para descubrir cuál es la mejor manera de anular este comportamiento en las que no es apropiada, en los siguientes escenarios por ejemplo:
ON DELETE RESTRICT (es decir, evitar la eliminación de un objeto si tiene registros secundarios)
eN NULL SET DELETE (es decir, no hacer eliminar un registro secundario, pero establecer su clave principal para NULL inst ead para romper la relación)
Actualizar otros datos relacionados cuando se elimina un registro (p. la eliminación de un archivo de imagen cargada)
Las siguientes son las formas posibles para lograr estos que yo sepa:
reemplazar el método del modelo
delete()
. Si bien este tipo de trabajo funciona, se evita cuando los registros se eliminan a través deQuerySet
. Además, se debe anular eldelete()
de todos los modelos para asegurarse de que nunca se llame al código de Django y no se pueda llamar alsuper()
, ya que puede usar unQuerySet
para eliminar objetos secundarios.Señales de uso. Esto parece ser ideal, ya que se llaman cuando se elimina directamente el modelo o se elimina a través de un QuerySet. Sin embargo, no hay posibilidad de evitar que un objeto secundario se elimine, por lo que no se puede implementar ON CASCADE RESTRICT o SET NULL.
utilizar un motor de base de datos que maneja esto correctamente (lo que hace Django puede hacer en este caso?)
Esperar a que Django soporta (y vivir con los insectos hasta entonces ...)
Parece que la primera opción es la única viable, pero es fea, arroja al bebé con el agua del baño y se arriesga a perder algo cuando se agrega una nueva modelo/relación.
¿Echo de menos algo? ¿Alguna recomendación?
+1 - de acuerdo a los documentos, la configuración 'También se requerirá on_delete' para los campos ForeignKey en Django 2.0. – whusterj