導入
「タイトルと本文を持つ記事」を保存したい。SQL で CREATE 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() を見て、件数が増えることを確かめましょう。title や published の値を変えても構いません。
演習
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) はそのままで大丈夫です(同じ表を新しい定義で作り直します)。