本文へスキップ
BecomeCoder

Djangoコース · 第5章 モデルとデータベース · レッスン19

モデルとは ― データベースを Python で書く

ブラウザで完結

導入

「タイトルと本文を持つ記事」を保存したい。SQLCREATE TABLE を書く代わりに、Django ではクラスを1つ書きます。それがモデルです。

説明

models.Model継承し、列(カラム)をフィールドとして宣言します。

import django
from django.conf import settings
if not settings.configured:
    settings.configure(DEBUG=True, SECRET_KEY="dev", INSTALLED_APPS=[],
        DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}})
    django.setup()

from django.db import models, connection

# モデル=データベースの表。各フィールドが列になる。
class Post(models.Model):
    title = models.CharField(max_length=100)   # 短い文字列(VARCHAR)
    body = models.TextField()                  # 長い文字列(TEXT)
    views = models.IntegerField(default=0)     # 整数、既定値0
    published = models.BooleanField(default=False)  # 真偽値
    class Meta:
        app_label = "blog"   # このコースの1ファイル構成では必要(本物では不要)

# 学習用:この表をデータベースに作る(本物ではマイグレーションが担当)
with connection.schema_editor() as schema:
    schema.create_model(Post)

# 1件保存してみる
p = Post.objects.create(title="はじめての記事", body="こんにちは", published=True)
print("id:", p.id)          # 自動で採番される主キー
print("title:", p.title)
print("件数:", Post.objects.count())
  • 各フィールドが表の列になります。CharField(短い文字列)、TextField(長文)、IntegerField(整数)、BooleanField(真偽)、他に DateField / DateTimeField / DecimalField など。
  • id主キー)は宣言しなくても Django が自動で用意し、保存時に採番します。
  • Post.objects が、その表を操作する入り口(マネージャ)。.create(...) で1件挿入、.count() で件数。

class Meta: app_label = "blog"schema.create_model(Post) は、このコースの1ファイル構成で表を用意するための準備です。本物のプロジェクトでは書きません(マイグレーションが自動でやります)。以降のレッスンでも同じ準備が入ります。

やってみよう

Post.objects.create(...) をもう1〜2回呼んでから Post.objects.count() を見て、件数が増えることを確かめましょう。titlepublished の値を変えても構いません。

演習

Post モデルに、真偽値のフィールド is_draft(下書きフラグ、既定 False)を追加してください。追加後もエラーなく1件保存でき、print(Post.objects.create(title="x", body="y").is_draft)False になれば成功です。

ヒント1を見る

is_draft = models.BooleanField(default=False) をフィールドに追加します。

ヒント2を見る

フィールドを足したら、その下の schema.create_model(Post) はそのままで大丈夫です(同じ表を新しい定義で作り直します)。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。