この記事は以下のターゲットを対象としています。
★5 Django の開発経験が 3 年以上。
★4 Django の開発経験が 1 年以上。
★3 WEB サイト開発経験あり。これから Django を学習します。
★2 Python 初級者。簡単なプログラムコードが書けます。
★1 プログラミング未経験。
こんにちは、グローバルウェイの大坪です。
前回のコラムではDjangoのマイグレーション機能についてお伝えしましたが、今回はDjangoの魅力の一つであるORM(Object-Relational Mapping)を使ったCURD操作をご紹介します。
前回のブログはこちら(https://gw-python.com/archives/149)
〔ORM(Object-Relational Mapping)とは?〕
Djangoでは、データベースのテーブルとPythonのクラスを紐づける仕組みとしてORMが利用されています。これにより、SQL文を直接書かずにPythonコードを使ってデータベースの操作が可能です。
〔CRUDとは?〕
CRUDは、データベースの基本的な操作を指し、以下の4つの操作からなります。
- C(Create): データの新規作成
- R(Read): データの取得
- U(Update): データの更新
- D(Delete): データの削除
〔Create(作成)〕
DjangoのORMを使用して新しいデータをデータベースに作成するには、以下の手順を踏みます。
【python】 from blog.models import Blog # モデルの新しいインスタンスを作成 new_blog = Blog(title=’はじめてのDjango’, content=’Djangoの魅力に迫る’) # データベースに新しいレコードを作成 new_blog.save() |
ここのコードでは、Blog モデルの新しいインスタンスを作成し、save メソッドを呼び出すことでデータベースに保存しています。生成されるSQL文は以下のような形になります。
【SQL】 INSERT INTO blog_blog(title, content) VALUES (‘はじめてのDjango’, ‘Djangoの魅力に迫る’); |
〔Read(取得)〕
データの取得は、検索クエリを使用して行います。Djangoにおいて、主に使用されるメソッドとして filter と get があります。これらの違いについて詳しく見ていきましょう。
filter メソッドは、指定された条件に合致する複数のレコードを取得します。例えば、タイトルに「Django」が含まれる記事を取得する場合は次のようになります。
【python】 from blog.models import Blog # タイトルに「Django」が含まれる記事を取得 django_blogs = Blog.objects.filter(title__contains=’Django’) |
この例では、Blog モデルから title に「Django」を含む記事を取得しています。filter メソッドは条件に合致する複数の結果を返す可能性があります。生成されるSQL文は以下のような形になります。
【SQL】 SELECT * FROM blog_blog WHERE title LIKE ‘%Django%’; |
get メソッドは、指定された条件に合致する一意のレコードを取得します。例えば、タイトルが「はじめてのDjango」の記事を取得する場合は次のようになります。
【python】 from blog.models import Blog # タイトルが「はじめてのDjango」の記事を取得 blog = Blog.objects.get(title=’はじめてのDjango’) |
生成されるSQL文は以下のような形になります。
【SQL】 SELECT * FROM blog _blog WHERE title = ‘はじめてのDjango’; |
get メソッドは条件に合致するレコードが存在しない場合や複数存在する場合には DoesNotExist または MultipleObjectsReturned の例外が発生します。
どちらを使用するかは、取得したいデータが一意であるか複数存在するかによります。一意のデータを取得する場合は get メソッドが便利ですが、複数のデータを取得する場合は filter メソッドを使用すると良いでしょう。
〔Update(更新)〕
既存のデータを更新するには、まず対象のデータを取得し、その後変更を加えて保存します。
【python】 from blog.models import Blog # タイトルが「はじめてのDjango」の記事を取得 blog_to_update = Blog.objects.get(title=’はじめてのDjango’) # 記事の内容を更新 blog_to_update.content = ‘Djangoの基本的な使い方を学びます’ # 更新内容をデータベースに保存 blog_to_update.save() |
生成されるSQL文は以下のような形になります。
【SQL】 UPDATE blog_blog SET content = ‘Djangoの基本的な使い方を学びます’ WHERE title = ‘はじめてのDjango’; |
〔Delete(削除)〕
データの削除を行うには、対象のデータを取得してから delete メソッドを呼び出します。
【python】 from blog.models import Blog # タイトルが「はじめてのDjango」の記事を取得して削除 blog_to_delete = Blog.objects.get(title=’はじめてのDjango’) blog_to_delete.delete() |
生成されるSQL文は以下のような形になります。
【SQL】 DELETE FROM myapp_blog WHERE title = ‘はじめてのDjango’; |
〔まとめ〕
ORMを用いるとSQL文を書く手間が省け、直感的で分かりやすいコードを書くことができます。次回は、Djangoのクラスベースビューについて紹介したいと思います。