Django モデルの On_delete パラメーターの機能
Django モデルは、データベースとテーブルの作成を簡素化し、テーブルへの新しいデータまたはタプルの追加、削除、取得、および変更を行います。Django モデルを使用すると、外部キーを使用してテーブル間の関係を簡単に設定できます。
関係を設定するときは、いくつかのパラメータの値を設定する必要があります。そのようなパラメータの 1つが on_delete
です。on_delete
パラメーターは、参照オブジェクトが削除されたときに採用する必要がある動作を構成するために使用されます。これは基本的に、参照されたオブジェクトの削除の影響がどのように処理されるかを定義するために使用されます。
on_delete
パラメーターを構成できる 7つの可能な動作またはアクションがあります。それらすべてについて個別に説明します。
CASCADE
引数
カスケード動作は、通常、モデル間の関係を設定するときに使用されます。参照されているオブジェクトが削除されると、その参照されているオブジェクトを参照しているすべてのオブジェクトも削除されます。
構文
XYZ = models.ForeignKey(WASD, on_delete=models.CASCADE)
それをもう少しよく理解するために、次の例を検討してください。同じ例を使用して、他のいくつかの動作も説明することに注意してください。
著者が自分自身を登録し、ウェブサイトにブログを書くことができるウェブサイトがあります。ここで、は 2つのエンティティを表し、2つのモデル、つまり Author
と Blog
について考えます。Blog
のすべてのエントリまたはタプルには、Author
エントリまたはタプルへの外部キー参照があります(または参照しています)。これは、すべてのブログがこれまでに作成されたものが、それを作成した作成者に属しているという関係を表しています。
ここで、作成者が自分のアカウントを削除すると、その作成者がこれまでに作成したすべてのブログが削除されるというポリシーが Web サイトにあるとします。このようなシナリオでは、カスケード関係が適切な選択になります。
PROTECT
引数
PROTECT
引数は、このオブジェクトを参照するオブジェクトがある場合、参照されるオブジェクトの削除を防ぎます。つまり、参照されているオブジェクトは、それを参照しているオブジェクトが存在する限り削除できません。参照オブジェクトを削除する前に、参照オブジェクトを手動で削除する必要があります。ProtectedError
を発生させることにより、削除を防ぎます。
この関係は、データが非常に重要で機密性が高く、適切な処理でデータを失うわけにはいかない場所で使用できます。または、参照オブジェクトが別の場所でも使用されており、適切な検証と処理がないと削除できない場合。
RESTRICT
引数
RESTRICT
は PROTECT
に似ています。また、参照されているオブジェクトの削除を防ぎ、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 relationship
の Album
オブジェクトによって参照されている 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)