Funktion des Parameters On_delete in Django-Modellen

Vaibhav Vaibhav 12 April 2022
  1. CASCADE-Argument
  2. PROTECT-Argument
  3. RESTRICT-Argument
  4. SET_NULL-Argument
  5. SET_DEFAULT-Argument
  6. SET()-Argument
  7. DO_NOTHING-Argument
Funktion des Parameters On_delete in Django-Modellen

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

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

Verwandter Artikel - Django Model