2010-10-02 8 views
6

Je réalise de plus en plus que je suis toujours un Django noob, je n'arrive pas à comprendre ce qui se passe avec mon modèle de données et pourquoi il ne fait pas de cascade de suppressions. Voici mon modèle.Django non en cas de suppression

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 

Et voici ma fonction de suppression

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")) 

Ainsi, chaque fil a des messages qui lui sont attachés, et tous les fils qui contiennent des messages connexes (c.-à-réponses) sont tous liés avec un identifiant de fil est une chaîne générée aléatoirement. Ainsi, lorsque je supprime, j'obtiens l'identifiant de thread initial (id généré automatiquement par django), puis je l'utilise pour saisir l'identifiant de thread unique et supprimer toutes les entrées qui contiennent cet identifiant de thread. Cependant, lorsque je supprime le thread, il n'est pas auto-cascadant et supprimant les objets de message associés. La chose étrange est que cela a fonctionné avant, mais a ensuite cessé de fonctionner, je ne suis pas trop sûr de savoir pourquoi. Des idées?

Répondre

4

Dans la version Django 1.3 il y a un paramètre qui on_delete Déterminants action "onDelete", par exemple:

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)) 

Alors peut-être essayer:

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

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

1

La suppression en cascade ne fonctionne pas ainsi. Puisque thread a une clé étrangère à message, si vous supprimez un message, l'effet en cascade est de supprimer tous les thread s associés. Consultez la documentation pour plus d'informations et des exemples:

Vous pouvez appeler delete sur le message associé si c'est ce que vous voulez.

Questions connexes