Was macht on_delete auf Django Modelle?

Ich bin sehr vertraut mit Django, aber vor kurzem bemerkt gibt es eine on_delete=models.CASCADE Option mit den Modellen, ich habe nach der Dokumentation für das gleiche gesucht, aber konnte nichts mehr finden als,

Geändert in Django 1.9:

on_delete kann nun als zweites Positionsargument verwendet werden (vorher wurde es typischerweise nur als Keyword-Argument übergeben). Es wird ein erforderliches Argument in Django 2.0 sein.

Ein Beispiel für den Gebrauch ist

 from django.db import models class Car(models.Model): manufacturer = models.ForeignKey( 'Manufacturer', on_delete=models.CASCADE, ) # ... class Manufacturer(models.Model): # ... pass 

Was macht on_delete? ( Raten Sie die Aktionen zu tun, wenn das Modell gelöscht wird )

Was macht models.CASCADE? ( Hinweise zur Dokumentation )

Welche anderen Optionen gibt es ( wenn meine Vermutung richtig ist )?

Wo liegt die Dokumentation dafür?

2 Solutions collect form web for “Was macht on_delete auf Django Modelle?”

Dies ist das Verhalten, das angenommen werden soll, wenn das referenzierte Objekt gelöscht wird. Es ist nicht spezifisch für django, das ist ein SQL-Standard.

Es gibt 6 mögliche Maßnahmen zu ergreifen, wenn ein solches Ereignis auftritt:

  • CASCADE : Wenn das referenzierte Objekt gelöscht wird, löschen Sie auch die Objekte, die Verweise darauf haben (Wenn Sie zB einen Blogpost entfernen, möchten Sie vielleicht auch Kommentare löschen). SQL-Äquivalent: CASCADE .
  • PROTECT : Verbot das Löschen des referenzierten Objekts. Um sie zu löschen, müssen Sie alle Objekte löschen, die sie manuell verweisen. SQL-Äquivalent: RESTRICT .
  • SET_NULL : Setzt den Verweis auf NULL (benötigt das Feld nullbar). Zum Beispiel, wenn Sie einen Benutzer löschen, möchten Sie vielleicht die Kommentare, die er auf Blog-Posts gepostet zu halten, aber sagen, es wurde von einem anonymen (oder gelöschten) Benutzer gepostet. SQL-Äquivalent: SET NULL .
  • SET_DEFAULT : SET_DEFAULT Sie den Standardwert fest. SQL-Äquivalent: SET DEFAULT .
  • SET(...) : Einen vorgegebenen Wert setzen. Dieser ist nicht Teil des SQL-Standards und wird komplett von Django behandelt.
  • DO_NOTHING : Wahrscheinlich eine sehr schlechte Idee, da dies Integritätsprobleme in deiner Datenbank schaffen würde (auf ein Objekt, das eigentlich nicht existiert). SQL-Äquivalent: NO ACTION .

Quelle: Django Dokumentation

Siehe auch die Dokumentation von PostGreSQL zum Beispiel.

In den meisten Fällen ist CASCADE das erwartete Verhalten, aber für jeden ForeignKey sollten Sie sich immer fragen, was das erwartete Verhalten in dieser Situation ist. PROTECT und SET_NULL sind oft nützlich. Einstellung CASCADE wo es nicht sollte, kann potenziell löschen Sie alle Ihre Datenbank in Kaskade, indem Sie einfach einen einzelnen Benutzer löschen.

Die on_delete Methode wird verwendet, um Django zu erzählen, was mit Modellinstanzen zu tun ist, die von der Modellinstanz abhängen, die Sie löschen. ( ForeignKey eine ForeignKey Beziehung). Der on_delete=models.CASCADE teilt Django mit, dass er den Löschenseffekt kaskadiert, dh auch die abhängigen Modelle weiter zu löschen.

Hier ist ein konkreteres Beispiel. Angenommen, Sie haben ein Author Modell, das ein ForeignKey in einem Book Modell ist. Nun, wenn Sie eine Instanz des Author Modells löschen, würde Django nicht wissen, was mit Instanzen des Buchmodells zu tun hat, die von dieser Instanz des Author abhängen. Die on_delete Methode sagt Django, was in diesem Fall zu tun ist. Die Einstellung on_delete=models.CASCADE wird Django anweisen, den Lösch-Effekt zu kaskadieren, dh alle on_delete=models.CASCADE zu löschen, die von der von Ihnen gelöschten Author Modellinstanz abhängen.

Hinweis: on_delete wird ein erforderliches Argument in Django 2.0. In älteren Versionen wird standardmäßig CASCADE .

Hier ist die gesamte offizielle Dokumentation.

  • GUI-Designer für die Verwaltung von Django-Modellen
  • Django Bild Größe und konvertieren vor dem Upload
  • Gibt es einen klugen Weg, um den vorherigen / nächsten Artikel mit dem Django ORM zu bekommen?
  • Queryset aus einer ManyToMany-Beziehung
  • Wie man die Summe von zwei Feldern für jedes Element im Quaryset berechnet
  • Bestellte Listen in django
  • Django: Warum kämpfen einige Modellfelder miteinander?
  • Django: Wie kann ich meine Model-Klassen verwenden, um mit meiner Datenbank von außerhalb Django zu interagieren?
  • Bild speichern über PIL zum Django-Modell
  • Summe von F () Ausdruck und Timedelta aus F () Ausdruck erstellt
  • Verschieben von Modellen zwischen Django (1.8) Apps mit erforderlichen ForeignKey Referenzen
  • Python ist die beste Programmiersprache der Welt.