Funktion des Parameters On_delete in Django-Modellen
-
CASCADE
-Argument -
PROTECT
-Argument -
RESTRICT
-Argument -
SET_NULL
-Argument -
SET_DEFAULT
-Argument -
SET()
-Argument -
DO_NOTHING
-Argument
Django-Modelle vereinfachen die Datenbank- und Tabellenerstellung, indem sie neue Daten oder Tupel zu Tabellen hinzufügen, löschen, abrufen und ändern. Mit Django-Modellen können wir mit Hilfe von Fremdschlüsseln leicht Beziehungen zwischen Tabellen herstellen.
Beim Einrichten von Beziehungen müssen wir Werte für einige Parameter festlegen. Ein solcher Parameter ist on_delete
. Mit dem Parameter on_delete
wird das Verhalten konfiguriert, das beim Löschen eines referenzierten Objekts angenommen werden soll. Es wird im Wesentlichen verwendet, um zu definieren, wie die Auswirkungen des Löschens eines referenzierten Objekts gehandhabt werden.
Es gibt sieben mögliche Verhaltensweisen oder Aktionen, für die der Parameter on_delete
konfiguriert werden kann. Wir werden über alle einzeln sprechen.
CASCADE
-Argument
Das kaskadierende Verhalten wird im Allgemeinen beim Einrichten von Beziehungen zwischen Modellen verwendet. Wenn ein referenziertes Objekt gelöscht wird, werden auch alle Objekte gelöscht, die auf dieses referenzierte Objekt verweisen.
Syntax
XYZ = models.ForeignKey(WASD, on_delete=models.CASCADE)
Betrachten Sie zum besseren Verständnis das folgende Beispiel. Beachten Sie, dass das gleiche Beispiel auch verwendet wird, um einige andere Verhaltensweisen zu erklären.
Es gibt eine Website, auf der sich Autoren registrieren und Blogs schreiben können. Betrachten Sie nun zwei Modelle, nämlich Author
und Blog
. Alle Einträge oder Tupel in Blog
haben eine Fremdschlüsselreferenz (oder referenzieren) auf einen Author
-Eintrag oder -Tupel. Es stellt eine Beziehung dar, dass jeder Blog, der jemals geschrieben wird, einem Autor gehört, der ihn geschrieben hat.
Nehmen wir an, die Website hat eine Richtlinie, dass, wenn ein Autor sein Konto löscht, alle Blogs, die er jemals geschrieben hat, entfernt werden. In einem solchen Szenario ist eine kaskadierende Beziehung eine geeignete Wahl.
PROTECT
-Argument
Das Argument PROTECT
verhindert das Löschen des referenzierten Objekts, wenn es Objekte gibt, die auf dieses Objekt verweisen. Mit anderen Worten, das referenzierte Objekt kann nicht gelöscht werden, solange Objekte vorhanden sind, die darauf verweisen. Die referenzierenden Objekte müssen vor dem Löschen des referenzierten Objekts manuell gelöscht werden. Das Löschen wird durch Auslösen eines ProtectedError
verhindert.
Diese Beziehung kann an Orten verwendet werden, an denen Daten sehr wichtig und sensibel sind und Sie es sich bei ordnungsgemäßer Handhabung nicht leisten können, sie zu verlieren. Oder wenn die referenzierenden Objekte auch woanders verwendet werden und sie ohne entsprechende Validierung und Handhabung nicht gelöscht werden können.
RESTRICT
-Argument
RESTRICT
ist ähnlich wie PROTECT
. Es verhindert auch das Löschen von referenzierten Objekten und löst einen RestrictedError
aus. Aber es gibt einen kleinen Unterschied zwischen den beiden. Wenn das referenzierte Objekt im Gegensatz zu PROTECT
auf ein anderes Objekt verweist, ist es eine CASCADE
-Beziehung und es wird auch gelöscht, dann ist das Löschen erlaubt. Mit anderen Worten, das Löschen des referenzierten Objekts ist erlaubt, wenn die referenzierenden Objekte und das referenzierte Objekt auf ein anderes gemeinsames Objekt in einer CASCADE
-Beziehung verweisen.
Betrachten Sie das folgende Beispiel.
class Artist(models.Model):
name = models.CharField(max_length=100)
class Album(models.Model):
artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
class Song(models.Model):
artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
album = models.ForeignKey(Album, on_delete=models.RESTRICT)
Wenn wir versuchen, ein Album
-Objekt zu löschen, wird RestrictedError
ausgegeben. Aber wenn wir versuchen, ein Artist
-Objekt zu löschen, dann ist das Löschen erfolgreich, vorausgesetzt, dass die Songs, die auf ein Album
-Objekt verweisen, auch auf das Artist
-Objekt verweisen, auf das das Album
-Objekt in einer CASCADE relationship
verweist.
SET_NULL
-Argument
Bei SET_NULL
wird, wie der Name schon sagt, beim Löschen eines referenzierten Objekts das referenzierte Objekt für alle referenzierenden Objekte auf NULL
gesetzt. Diese Beziehung erfordert, dass das referenzierte Objektfeld NULL-fähig ist.
XYZ = models.ForeignKey(WASD, on_delete=models.SET_NULL, null=True)
Wenn die Website beispielsweise eine Richtlinie hat, dass, wenn ein Autor das Unternehmen verlässt, seine Blogs nicht gelöscht werden. Stattdessen wird der Autor für alle Blogs auf einen anonymen Autor oder None
gesetzt.
SET_DEFAULT
-Argument
Bei SET_DEFAULT
wird beim Löschen eines referenzierten Objekts das referenzierte Objekt für alle referenzierenden Objekte auf einen Standardwert gesetzt. Dieser Standardwert kann NULL
sein, ebenso wie einige andere Django-Modelle oder -Tabellen. Diese Beziehung erfordert, dass das referenzierte Objektfeld im Fall von NULL
nullfähig ist.
XYZ = models.ForeignKey(WASD, on_delete=models.SET_DEFAULT, null=True, default=QWERTY)
Wenn die Website beispielsweise eine Richtlinie hat, dass der Autor für alle seine Blogs der Administrator oder das Unternehmen selbst ist, wenn ein Autor das Unternehmen verlässt. In solchen Fällen wäre SET_DEFAULT
die richtige Wahl.
SET()
-Argument
SET()
ist genau das gleiche wie SET_DEFAULT
. Es kann auch Django-Modelle oder -Tabellen akzeptieren. Der einzige Unterschied besteht darin, dass wir in SET()
ein Callable übergeben können, das für alle referenzierenden Objekte aufgerufen wird, wenn das referenzierte Objekt gelöscht wird.
XYZ = models.ForeignKey(WASD, on_delete=models.SET(...), null=True)
Die aufrufbare Funktion zusammen mit einem Modell würde in etwa so aussehen.
def getUser():
"""Callable function"""
return User.objects.get_or_create(username="anonymous")[0]
class Author(models.Model):
user = models.ForeignKey(User, on_delete=models.SET(getUser))
DO_NOTHING
-Argument
DO_NOTHING
ist eine etwas riskante Beziehung, die zwischen zwei Modellen bestehen kann. Wie der Name schon sagt, wird beim Löschen eines referenzierten Objekts das referenzierte Objekt nicht für alle referenzierenden Objekte geändert. Mit anderen Worten, es wird nichts unternommen, um die Auswirkungen des Löschens zu behandeln.
Dies ist ein sehr riskantes Verhalten, da es zu Integritätsproblemen führen kann, da das referenzierte Objekt gelöscht wird, die referenzierenden Objekte jedoch weiterhin darauf verweisen.
XYZ = models.ForeignKey(WASD, on_delete=models.DO_NOTHING)