2010-10-02 23 views
6

Me estoy dando cuenta cada vez más de que todavía soy un novato de Django, no puedo entender lo que está sucediendo con mi modelo de datos y por qué no se elimina en cascada. Aquí está mi modelo.Django no en cascada en eliminar

class message(models.Model): 
    msg_text = models.CharField(max_length = 9900) 
    date_time = models.DateTimeField() 
    is_read = models.BooleanField(default=False) 


class thread(models.Model): 
    message = models.ForeignKey(message) 
    subject = models.CharField(max_length=160) 
    from_user = models.ForeignKey(User, related_name = 'from_user') 
    to_user = models.ForeignKey(User, related_name = 'to_user') 
    thread_id = models.CharField(max_length = 36) 

def __unicode__(self): 
    return self.subject 

Y entonces aquí es mi función de eliminación

def delete_message(request, thread_id): 
    t = thread.objects.get(id=thread_id) 
    thread.objects.filter(thread_id = t.thread_id).delete() 

    return HttpResponseRedirect(reverse("inbox.views.index")) 

Así que cada hilo tiene mensajes que se le atribuye, y todos los hilos que contienen mensajes relacionados (es decir, respuestas) están todos relacionados con un ID de hilo que es una cadena generada aleatoriamente Así que cuando lo borro, obtengo el id. Del subproceso inicial (Id. Autogenerado de django) y luego lo uso para obtener el Id. De subproceso único y eliminar todas las entradas que contienen ese Id. De subproceso. Sin embargo, cuando elimino el hilo, no es una cascada automática y elimina los objetos de mensaje relacionados.

Lo raro es que funcionó antes, pero luego dejó de funcionar, no estoy muy seguro de por qué. Alguna idea?

Respuesta

4

En Django versión 1.3 no es un parámetro on_delete cuales determinantes acción "ondelete", por ejemplo:

def get_sentinel_user(): 
    return User.objects.get_or_create(username='deleted')[0] 

class MyModel(models.Model): 
    user = models.ForeignKey(User, on_delete=models.SET(get_sentinel_user)) 

Así que tal vez probar:

class thread(models.Model): 
    message = models.ForeignKey(message, on_delete=models.CASCADE) 
    ... 

fuente http://docs.djangoproject.com/en/1.3/ref/models/fields/

1

No es así como funciona la eliminación en cascada. Como thread tiene una clave externa a message, si elimina un message, el efecto de cascada es eliminar todas las thread asociadas. Consulte la documentación para obtener más información y ejemplos:

Se podría llamar delete en el mensaje asociado si eso es lo que quiere.

Cuestiones relacionadas