見出し画像

【74日目】Djangoのmodels.pyあれこれ_プログラミング学び日記

 このnoteは、31歳未経験からエンジニアを目指して勉強していく記録を綴っているものです。現在はAdTechでカスタマーサクセスを担当しつつ、色んなチャンスに恵まれ、CS業務や子育てと並行しながらチャレンジしています。

 これからプログラミングを始める方にとってのTipsやモチベアップに繋げられるように頑張りたいと思っています。
--------------------------------------------

以前作成したTodoアプリでも活用した「model.py」に関してです。以下動画で学んで肉付けができてきました。


Todoアプリのソースコードはこちらです。


Djangoのモデルとは?

Djangoでデータベースを扱うためのものです。Webフレームワークでは直接データベースを触ることはほとんどなく、Djangoではこの「モデル」を通して色々な操作をします。概念としてはPythonのクラスと同様です。

設定するファイルは「models.py」です。


どうしてモデルからデータベースに保存される?

DjangoではORM (Object Relational Mapping)が実装されているためです。ORMとはその名の通り、ObjectとRelational Databaseをマッピングすることです。

よりかみ砕いて言うと「Python上で書いたクラスが自動的にデータベースに保存される」、かつ「データベースに保存したデータが自動的にPythonのクラスに変換される」、という環境になっています。


Models.pyはどのように書く?

何パターンか紹介します。
まずTodoアプリで作成したコードは以下です。

from django.db import models

class Todo(models.Model):
    title = models.CharField(
        "タスク名", 
        max_length=30, 
        help_text='【社名】を記載してください')

    description = models.TextField(
        "詳細",
        blank=True,
        help_text='作成物の対象期間や属性などの詳細を記入してください')

    deadline = models.DateField(
        "締切")

    def __str__(self):
        return self.title

「models」というライブラリをインポートして、「Model」というクラスを継承して各モデルを作成します。ここではTodoというモデルを作成しています。

モデル内の「title」「description」「deadline」がデータベースのカラムに該当しており、括弧の中で細かい属性を定義しています。""で囲った日本語の部分は、ブラウザに表示される際に表示される名前になります。

最後の「__str__」は、管理画面に表示されるモデル内のデータを判別するための名前を定義しているものです。管理画面でモデルを見に行くと、そこに含まれるデータが一覧化されており、その一覧に何を表示させるかです。大抵はnameやtitleなどを設定します。


↓別のアプリでこのような内容でも作ってみました。
こちらではCategoryとTagが大きなポイントです。

from django.db import models

# Create your models here.
class Category(models.Model):
    name = models.CharField(
        max_length=255,
        blank=False,
        null=False,
        unique=True)

    def __str__(self):
        return self.name


class Tag(models.Model):
    name = models.CharField(
        max_length=225,
        blank=False,
        null=False,
        unique=Tr)

    def __str__(self):
        return self.nama


class Post(models.Model):
    title = models.CharField(
        max_length = 255,
        blank = False,
        null = False)

    bady = models.TextField(
        blank = True,
        null = False)

    category = models.ForeignKey(
        Category,
        on_delete=models.CASCADE)

    tags = models.ManyToManyField(
        Tag,
        blank=True)

    def __str__(self):
        return self.title

データを特定のカテゴリーで分類したり、特定のタグを付与したり、ということはよくあると思います。それを実現するためのモデルが上記です。

大枠は以下の手順です。
①CategoryとTagというモデルをそれぞれ作る
②Postのフィールドにcategoryとtagsを作り、①のモデルを紐づける

肝心なポイントですが、
・カテゴリーは1 対 複数の関係(ForeignKey)
・タグは複数 対 複数の関係(ManyToMany)
という前提で、データベース同士を紐づけます。

Djangoで準備してくれているのでmodelsのForeignKeyメソッドやManyToManyFieldメソッドを使うだけでOKです。


Models.pyを書いた後は?

定義したモデルをデータベース上に作成する必要があります。
(作成したアプリをプロジェクトの全体設定ファイルに追加しておくのを忘れずに)

まず以下のコマンドを実行してマイグレーションファイルを作成します。

python manage.py makemigrations アプリ名

これによって、作成したモデルをデータベースに反映させるコマンドが自動生成されます。migrationsというディレクトリに「0001_initial.py」が生成されており、中にコードがびっしり入っているので見てみてください。

次に、以下のコマンドを実行することで、Djangoが元々用意しているコマンドと、上記で自動生成されたコマンドが全て回収されて実行されます。

python manage.py migrate


これでモデルをデータベースに書き込む作業は完了です!
実際にデータを入れる準備が整いました。

ちなみにデータベースに反映した後に、フィールド名を変えたりすることも可能です。詳しくは以下の記事に載っていたので参照してみてください。

上記の記事ではフィールド名の変更だけに触れられていますが、その他の操作も公式ドキュメントに見やすくまとめられています。


参考

これまで修了したコース等

【YouTube動画】
Pythonでウェブサービスを作ろう! #1
テンプレートをマスターしよう! #2
静的ファイルを配信しよう !#3
本番公開しよう! #4
データベースと接続しよう! #5 
ブログを作って学ぶモデル入門! #6

【Paiza】
Aランクレベルアップメニュー 24/49問
ループメニュー1              20/20問
ループメニュー2              12/20問
配列メニュー      56/64問
条件分岐メニュー    25/25問
二重ループメニュー   19/19問
配列活用メニュー    26/26問
文字列処理メニュー   30/30問
Bランクレベルアップメニュー 62/62問
Cランクレベルアップメニュー 30/30問
ランクB合格
ランクC合格

【書籍/ブログ】
Django入門 | 初心者でも1時間でWebアプリ(Todoアプリ)を作成するコース
基礎からのMySQL     514/514頁
Web技術の基本      189/189頁 ※2周目中
京大のPython教科書    116/201頁
Pythonデータベースプログラミング 194/194頁
Pythonエンジニアファーストブック読了

【Progate】
Python Ⅰ~Ⅴ
Python アプリ版 コースⅠ~Ⅴ
SQL Ⅰ~ Ⅳ
SQL アプリ版 コースⅢ
HTML&CSS 初級編

【その他】
Pythonの環境構築
VSCodeの環境構築
MySQLの環境構築(MAMP)
Git / GitHubの環境構築
HEROKUの環境構築


いいなと思ったら応援しよう!