はじめに
DjangoのORM(Object-Relational Mapping)は、データベース操作を直感的で簡単に行えるように設計されています。この記事では、特にデータ削除にフォーカスし、Djangoのdeleteメソッドの使い方を詳しく解説します。初心者から中級者まで役立つ具体的なコード例を豊富に提供しますので、Djangoでの効率的なデータ削除方法を身につけましょう。
Django ORM Deleteメソッドの基本
DjangoのORMでは、モデルインスタンスを使ってデータベースのレコードを削除することができます。基本的な使い方は非常にシンプルです。以下にその例を示します。
from myapp.models import MyModel
# 特定のオブジェクトを取得
obj = MyModel.objects.get(id=1)
# オブジェクトを削除
obj.delete()
このコードは、MyModel
の id が 1 のレコードを削除します。
バルク削除の実行
複数のオブジェクトを一度に削除することも可能です。これは「バルク削除」と呼ばれ、効率的なデータ処理に役立ちます。
from myapp.models import MyModel
# 条件にマッチする複数のオブジェクトを削除
MyModel.objects.filter(name="John Doe").delete()
この例では、name
が “John Doe” であるすべてのレコードを削除します。
関連オブジェクトの削除
Djangoのモデル間には関連が設定されている場合があります。あるオブジェクトを削除する際、その関連オブジェクトも同時に削除したい場合があります。
from myapp.models import ParentModel, ChildModel
# 親オブジェクトを取得
parent = ParentModel.objects.get(id=1)
# 親オブジェクトと関連する子オブジェクトを削除
parent.delete()
このコードは、ParentModel
の id が 1 のオブジェクトと、それに関連する ChildModel
のオブジェクトを削除します。
カスケード削除の制御
デフォルトでは、Djangoは関連オブジェクトをカスケード削除します。しかし、これをカスタマイズすることも可能です。
from django.db import models
class ChildModel(models.Model):
parent = models.ForeignKey(ParentModel, on_delete=models.PROTECT)
この例では、on_delete=models.PROTECT
を設定することで、親オブジェク
トが削除される際に、関連する ChildModel
のオブジェクトが保護され、削除されないようになります。
トランザクション内での削除
データベースの整合性を保つために、複数の削除操作をトランザクション内で実行することが望ましい場合があります。
from django.db import transaction
from myapp.models import MyModel
with transaction.atomic():
# トランザクション内で複数の削除操作を実行
MyModel.objects.filter(category="obsolete").delete()
MyModel.objects.filter(date__lt=date(2020, 1, 1)).delete()
このコードでは、特定のカテゴリーを持つオブジェクトと、特定の日付より古いオブジェクトをトランザクション内で削除しています。