6 Stimmen

Django kaskadiert nicht beim Löschen

Ich erkenne mehr und mehr, dass ich immer noch ein Django Noob bin, ich kann nicht scheinen, um herauszufinden, was mit meinem Datenmodell geschieht und warum es nicht Kaskadierung löscht. Hier ist mein Modell.

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

Jeder Thread ist also mit Nachrichten verknüpft, und alle Threads, die zusammenhängende Nachrichten (d.h. Antworten) enthalten, sind alle mit einer Thread-ID verknüpft, die eine zufällig generierte Zeichenfolge ist. Wenn ich also lösche, erhalte ich die ursprüngliche Thread-ID (von Django automatisch generierte ID) und verwende sie dann, um die eindeutige Thread-ID zu ermitteln 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 gelöscht.

Das Seltsame ist, dass es vorher funktionierte, aber dann nicht mehr, ich bin mir nicht ganz sicher, warum. Irgendwelche Ideen?

5voto

damienix Punkte 6023

In Django Version 1.3 gibt es einen on_delete Parameter, der z.B. die Aktion "ondelete" bestimmt:

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

Also 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/

1voto

ars Punkte 112843

So funktioniert das kaskadierende Löschen nicht. Da thread hat einen Fremdschlüssel zu message Wenn Sie eine message werden als Kaskadeneffekt alle zugehörigen thread s. In der Dokumentation finden Sie weitere Informationen und Beispiele:

Sie könnten anrufen delete auf die zugehörige Nachricht, wenn Sie das wollen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X