18

Estoy creando un sistema de comentarios personalizado que puede adjuntar comentarios a cualquier modelo utilizando los tipos de contenido GenericForeignKey.¿Por qué no mi cascada GenericForeignKey al eliminar?

class Comment(models.Model): 
    body = models.TextField(verbose_name='Comment') 
    user = models.ForeignKey(User) 
    parent = models.ForeignKey('self', null=True, blank=True) 
    created = models.DateTimeField(auto_now_add=True) 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

Tengo entendido que cuando el modelo se adjunta el comentario se elimina, la eliminación debe conectar en cascada y quitar el comentario también.

Desafortunadamente, esto no está sucediendo y estoy perplejo. ¿Hay alguna razón común por la que cambiaría el comportamiento de eliminación predeterminado?

Respuesta

24

No, la documentación no lo dice. Lo que dice es que si define un GenericRelation en un modelo, es decir, el reverso del GenericForeignKey, cuando se elimine el elemento con el FK genérico, también se eliminará el elemento con GenericRelation.

A diferencia de ForeignKey, GenericForeignKey no acepta un argumento on_delete para personalizar este comportamiento; si lo desea, puede evitar la eliminación en cascada simplemente no usando GenericRelation, y el comportamiento alternativo se puede proporcionar a través de la señal pre_delete.

+0

Gracias, leí mal esa parte de la documentación y asumí que significaba que se conectaría en cascada de manera predeterminada. – Soviut

+0

Muchas gracias, dónde estaban mis ojos ... – valex

+0

Creo que los documentos de django deberían indicarlo al revés. "GenericForeignKey NO elimina en cascada, sino que establece el valor en nulo. Se aplica en cascada SÓLO si se utiliza GenericRelation en el modelo relacionado". Esto es necesario porque obtenemos la eliminación en cascada de forma predeterminada en las claves externas normales. –

Cuestiones relacionadas