「Djangoパーフェクトマスター」【デモ】対話型シェルでモデルの機能を確かめる【Udemyで学習】

www.youtube.com

このレクチャーでは「対話型シェルでモデルの機能を確かめる」のデモをご覧いただきます。

モデルを定義して、マイグレーションを実行し、データベースにテーブルが作成できたら、次は対話型シェルで、モデルの機能を確かめてみましょう。

DjangoではORM(オブジェクト関係マッピング)という手法を使って、データベースの操作を行います。このレクチャーでのデータベース操作は、全て、ORMによって準備された「オブジェクト指向のメソッド」を使用します。ORMを知らない方にも、このような操作がORMかと実感していただけると思います。

対話型シェルは「python manage.py shell」とタイプして、開始します。

まずは「from news.models import Article, Reporter」とタイプして、作ったモデルクラスの使用を宣言します。

プロンプトでは、ORMとして準備された、データベースを操作するメソッドを実行することが可能です。「Reporter.objects.all() とタイプしましょう。allというメソッド名によって、Reporter(リポーター)テーブル全てを取得するんだなと容易に推測することができます。実行すると、空のリストが返却されます。空のリストは、Reporterテーブルには一行もレコードが存在しないことを、意味します。

次は「r = Reporter(full_name='John Smith')」とタイプします。これはfull_nameがJohn SmithのReporter(リポーター)のインスタンスを準備することを意味します。この段階では、データベースのReporter(リポーター)テーブルには格納されていません。続けて「r.save()」とタイプします。このsaveメソッドを実行することで、始めてテーブルにINSERTされます。「r.id」とタイプすると、idの数値が確認できました。idは、データベースに格納して始めて付与される数値なので、テーブルに格納されたことが確認できるというわけです。

再び「Reporter.objects.all()」をタイプします。ご覧の通り、Reporterテーブルから1件取得できたことがわかります。Reporter.objectsのobjectsとはモデルクラスによって提供される、データベース操作のマネージャーと思ってください。すなわち、Reporterモデルのマネージャに対して、全検索を依頼しているのです。

「r.full_name」とタイプすると、John Smithが返却されます。インスタンスのフィールドをアクセスすることで、カラムの値を参照することができます。

今度は「Reporter.objects.get(id=1)」とタイプします。idが1のレコードを取得することができました。getは、一件のインスタンスを取得するORMメソッドです

引き続き「Reporter.objects.get(full_name__startswith='John')」とタイプします。このメソッドの実行によって、指定のカラムが指定の文字列で始まるレコードを取得できます。この例ではfull_nameカラムがJohnで始まるというレコードを取得しろという意味となります。

今度は「Reporter.objects.get(full_name__contains='mith')」とタイプします。mithが含まれるレコードを取得できます。引数の、二回連続するアンダースコア)の後ろは、検索のための演算子です。演算子がcontainsなので「含まれる」という操作だと、直感的に感じることができるのです。

次は「Reporter.objects.get(id=2)」をタイプします。idが2のレコードはまだ無いので、DoesNotExist例外が帰ってきました。

次に、Airticleレコードを追加してみます。準備として「from datetime import date」とタイプします。Airticleクラスのpub_dateプロパティはdate型を扱うので、dateモジュールをimportしています。

次に、「a = Article(pub_date=date.today(), headline='Django is cool', content='Yeah.', reporter=r)」とタイプします。Reporterテーブルの外部キーであるreporter(リポーター)フィールドには、Reporterモデルインスタンスが設定された変数rを設定しているので、このアーティクルのリポーターは「John Smith」だということになります。

続けて「a.save()」とタイプします。この操作によってArticle(アーティクル)テーブルにレコードが保存されました。

「Article.objects.all()」をタイプします。Articleテーブルを全検索して、1件取得できたことがわかります。

次に「r = a.reporter」とタイプします。これは、Articleインスタンスから、reporterフィールドを通じて、Reporterインスタンスを取り出しています。つづいて「r.full_name」とタイプします。「John Smith」が確認できました。

「r.article_set.all()」とタイプします。これは、特定のReporter(リポーター)インスタンスに紐付いた、全てのArticle(アーティクル)インスタンスリストを取得できます。

次に、「Article.objects.filter(reporter__full_name__startswith='John')」とタイプします。これは「full_nameがJohnで始まるReporterと紐付くArticleを検索しろ」という意味になります。ちょっと複雑な条件も、わかりやすいコードで記載できるということが、お分かりいただけると思います。

次に「r.full_name = 'Billy Goat'」とタイプして、Reporterインスタンスのfull_nameを'John Smith'から'Billy Goat'に変更します。続いて「r.save()」とタイプしてテーブルのレコードを更新します。

最後は「r.delete()」とタイプして削除を確認したいところですが、テーブルを空にすると、この後、ビューやテンプレートを作った後の検証がしにくくなるため、deleteは実施しないこととします。

最後にquit()とタイプして対話型シェルを終了させましょう。

Djangoは、モデルを定義しただけで、モデルを操作するメソッドを自動的に作成してくれます。とても直感的で使い勝手がいいメソッドが、モデルのフィールド定義から作られるのです。DjangoにおけるORMの魅力が、少しわかっていただけたのではないでしょうか?

以上で「対話型シェルでモデルの機能を確かめる」のデモを終わります。

★★★ 続きはUdemyで ★★★
https://www.udemy.com/course/django_master/?referralCode=3B5D0AF66B09A7B8DD25
★★★ コース内でお逢いできることを楽しみにしています。 ★★★