2016-04-14 4 views
0

Wenn ich ein Objekt in der Admin-Oberfläche lösche, möchte ich das Entfernen verwandter Objekte verhindern.Django: Wie man Admin die relativen Objekte nicht löschen lässt?

class ObjectToDelete(models.Model): 
    timestamp = models.DateTimeField() 

class RelatedObject(models.Model): 
    otd = models.ForeignKey('app.ObjectToDelete', null=True, blank=True) 

Da die ForeignKey in RelatedObject NULL-Werte zulässt, sollte ich in der Lage sein, es zu None zu setzen, anstatt das gesamte Objekt zu löschen. Und das ist genau das Verhalten, das ich haben möchte.

Ich weiß, dass ich benutzerdefinierte Löschaktionen für diese Admin-Oberfläche erstellen kann.

Und ich bin mir auch bewusst, dass ich in ObjectToDelete machen könnte, die auch Entfernung von RelatedObject verhindern würde. Aber dann hätte ich nicht die Eins-zu-Viele-Beziehung, die ich möchte.

Gibt es einen einfachen Weg, dies zu erreichen?

Antwort

1

Legen Sie die Option on_delete für Ihren Fremdschlüssel fest. Wenn Sie den Wert auf None festlegen möchten, wenn das zugehörige Objekt gelöscht wird, verwenden SET_NULL:

models.ForeignKey('app.ObjectToDelete', on_delete=models.SET_NULL) 

Diese Regeln gelten jedoch löschen Sie ein Objekt, ob Sie es in der Admin-Panel zu tun oder arbeiten direkt mit dem Modell Beispiel. (Es wird jedoch nicht wirksam, wenn Sie direkt mit der zugrunde liegenden Datenbank in SQL arbeiten.)

+3

Es könnte besser sein, ['SET_NULL'] (https://docs.djangoproject.com/en/1.9/ref /models/fields/#django.db.models.SET_NULL) für Ihr Beispiel anstelle von 'CASCADE', da das OP nicht möchte, dass das zugehörige Objekt gelöscht wird. – Alasdair

+0

@Alasdair, ja du hast Recht, wir können hier SET_NULL verwenden. Aber in Bezug auf die Leistung sind beide auf der Datenbankebene, kann nicht mit Sicherheit sagen, wer schneller ist. –

+2

Es geht nicht darum, was schneller ist. Die Verwendung von 'models.CASCADE' (das Standardverhalten bis Django 2.0) löscht die zugehörigen Objekte. Genau das versucht das OP zu vermeiden. – Alasdair

Verwandte Themen