Django モデルの On_delete パラメーターの機能

Vaibhav Vaibhav 2023年1月30日
  1. CASCADE 引数
  2. PROTECT 引数
  3. RESTRICT 引数
  4. SET_NULL 引数
  5. SET_DEFAULT 引数
  6. SET() 引数
  7. DO_NOTHING 引数
Django モデルの On_delete パラメーターの機能

Django モデルは、データベースとテーブルの作成を簡素化し、テーブルへの新しいデータまたはタプルの追加、削除、取得、および変更を行います。Django モデルを使用すると、外部キーを使用してテーブル間の関係を簡単に設定できます。

関係を設定するときは、いくつかのパラメータの値を設定する必要があります。そのようなパラメータの 1つが on_delete です。on_delete パラメーターは、参照オブジェクトが削除されたときに採用する必要がある動作を構成するために使用されます。これは基本的に、参照されたオブジェクトの削除の影響がどのように処理されるかを定義するために使用されます。

on_delete パラメーターを構成できる 7つの可能な動作またはアクションがあります。それらすべてについて個別に説明します。

CASCADE 引数

カスケード動作は、通常、モデル間の関係を設定するときに使用されます。参照されているオブジェクトが削除されると、その参照されているオブジェクトを参照しているすべてのオブジェクトも削除されます。

構文

XYZ = models.ForeignKey(WASD, on_delete=models.CASCADE)

それをもう少しよく理解するために、次の例を検討してください。同じ例を使用して、他のいくつかの動作も説明することに注意してください。

著者が自分自身を登録し、ウェブサイトにブログを書くことができるウェブサイトがあります。ここで、は 2つのエンティティを表し、2つのモデル、つまり AuthorBlog について考えます。Blog のすべてのエントリまたはタプルには、Author エントリまたはタプルへの外部キー参照があります(または参照しています)。これは、すべてのブログがこれまでに作成されたものが、それを作成した作成者に属しているという関係を表しています。

ここで、作成者が自分のアカウントを削除すると、その作成者がこれまでに作成したすべてのブログが削除されるというポリシーが Web サイトにあるとします。このようなシナリオでは、カスケード関係が適切な選択になります。

PROTECT 引数

PROTECT 引数は、このオブジェクトを参照するオブジェクトがある場合、参照されるオブジェクトの削除を防ぎます。つまり、参照されているオブジェクトは、それを参照しているオブジェクトが存在する限り削除できません。参照オブジェクトを削除する前に、参照オブジェクトを手動で削除する必要があります。ProtectedError を発生させることにより、削除を防ぎます。

この関係は、データが非常に重要で機密性が高く、適切な処理でデータを失うわけにはいかない場所で使用できます。または、参照オブジェクトが別の場所でも使用されており、適切な検証と処理がないと削除できない場合。

RESTRICT 引数

RESTRICTPROTECT に似ています。また、参照されているオブジェクトの削除を防ぎ、RestrictedError を発生させます。しかし、2つの間にわずかな違いがあります。PROTECT とは異なり、参照されているオブジェクトが他のオブジェクトを参照している場合、それは CASCADE 関係であり、それも削除されている場合、削除は許可されます。言い換えると、参照オブジェクトと参照オブジェクトが CASCADE 関係にある他の共通オブジェクトを参照している場合、参照オブジェクトの削除が許可されます。

次の例を考えてみましょう。

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)

Album オブジェクトを削除しようとすると、RestrictedError が発生します。しかし、Artist オブジェクトを削除しようとすると、Album オブジェクトを参照している曲が CASCADE relationshipAlbum オブジェクトによって参照されている Artist オブジェクトも参照しているため、削除は成功します。

SET_NULL 引数

SET_NULL の場合、その名前が示すように、参照オブジェクトが削除されると、すべての参照オブジェクトの参照オブジェクトが NULL に設定されます。この関係では、参照されるオブジェクトフィールドが NULL 可能である必要があります。

XYZ = models.ForeignKey(WASD, on_delete=models.SET_NULL, null=True)

たとえば、Web サイトに、作成者が離れた場合、そのブログは削除されるというポリシーがある場合です。代わりに、すべてのブログの作成者は匿名の作成者または None に設定されます。

SET_DEFAULT 引数

SET_DEFAULT の場合、参照オブジェクトが削除されると、すべての参照オブジェクトの参照オブジェクトがデフォルト値に設定されます。このデフォルト値は、他の Django モデルまたはテーブルと同様に NULL にすることができます。この関係では、NULL の場合、参照されるオブジェクトフィールドが null 可能である必要があります。

XYZ = models.ForeignKey(WASD, on_delete=models.SET_DEFAULT, null=True, default=QWERTY)

たとえば、Web サイトに、作成者が離れた場合、すべてのブログの作成者が管理者または会社自体になるというポリシーがある場合。このような場合、SET_DEFAULT が正しい選択です。

SET() 引数

SET()SET_DEFAULT とまったく同じです。Django モデルまたはテーブルも受け入れることができます。唯一の違いは、SET() で呼び出し可能オブジェクトを渡すことができることです。呼び出し可能オブジェクトは、参照オブジェクトが削除された場合にすべての参照オブジェクトに対して呼び出されます。

XYZ = models.ForeignKey(WASD, on_delete=models.SET(...), null=True)

呼び出し可能な関数は、モデルとともに、次のようになります。

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 引数

DO_NOTHING は、2つのモデル間に存在する可能性のある少し危険な関係です。名前が示すように、参照オブジェクトが削除されても、参照オブジェクトはすべての参照オブジェクトに対して変更されるわけではありません。つまり、削除の影響を処理するために何も実行されません。

これは、参照されるオブジェクトが削除されるために整合性の問題を引き起こす可能性があるため、非常に危険な動作ですが、参照するオブジェクトは引き続きそれを参照しています。

XYZ = models.ForeignKey(WASD, on_delete=models.DO_NOTHING)
著者: Vaibhav Vaibhav
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.

関連記事 - Django Model