2010-10-02 6 views
6

Ich realisiere immer mehr, dass ich immer noch ein Django noob bin, ich kann nicht herausfinden, was mit meinem Datenmodell passiert und warum es nicht kaskadiert löscht. Hier ist mein Modell.Django nicht kaskadieren auf löschen

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 

Und dann ist hier meine Löschfunktion

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

So hat jeder Thread Nachrichten an sie gebunden, und alle Fäden, die im Zusammenhang Nachrichten enthalten (dh Antworten) sind alle mit einem Thread-ID Zusammenhang die ist eine zufällig generierte Zeichenfolge. Also, wenn ich lösche, bekomme ich die anfängliche Thread-ID (django automatisch generierte ID) und verwende sie dann, um die eindeutige Thread-ID zu erfassen und alle Einträge zu löschen, die diese Thread-ID enthalten. Wenn ich jedoch den Thread lösche, werden die zugehörigen Nachrichtenobjekte nicht automatisch kaskadiert und gelöscht.

Die komische Sache ist, dass es vorher funktioniert hat, aber dann aufgehört zu arbeiten, ich bin mir nicht sicher, warum. Irgendwelche Ideen?

Antwort

4

In Django-Version 1.3 gibt es einen on_delete Parameter, die "onDelete" Aktion, zum Beispiel Determinanten:

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

Vielleicht versuchen:

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

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

1

So funktioniert das kaskadierende Löschen nicht. Da thread einen Fremdschlüssel zu message hat, wenn Sie eine message löschen, ist der kaskadierende Effekt, alle zugehörigen thread s zu löschen. Lesen Sie die Dokumentation für weitere Informationen und Beispiele:

Sie delete auf der zugehörigen Nachricht nennen könnte, wenn das ist, was Sie wollen.

Verwandte Themen