Computer368106 views
高校倫理1440106 views
高校物理160203 views
数学講師2886227 views
小学算数1200427 views
教育149510 views
高校日本史190571 views
いろは3010814 views
中学英語811710 views
高校化学2924392 views
Help
Tools
NewsSpreadsheetCalendarSlidesTier ListPen ToolIllustrationCrayonPixel ArtASCII ArtPerspectiveEndless StairsGraphMind MapER DiagramFamily TreeMemeCurved TextImage EditorMosaicRetro FilterPencil SketchOCR/HighlighterMakeup EditorFaviconVideo TrimmerScrolling VideoVideo TitleColor PickerColor ExtractorBonfireFireworksWater RippleWater SplashBreaking GlassWood GrainMarble TextureCSS ButtonIcon MakerBar ChartGrouped Bar ChartStacked Bar ChartPie ChartLine ChartArea ChartStacked Area ChartScatter Plot3D Bar Chart3D Pie ChartBar Chart RaceBubble ChartPopulation PyramidPictogramEarningsCandlestick ChartInvestment RiskMortgage SimulatorCalculatorMatrix CalculatorFunction GraphPolynomial ExpansionVenn DiagramField VisualizerRubik's Cube Group TheoryTraveling SalesmanVoronoi and DelaunayFractalColumn ArithmeticDraw Math FiguresArithmetic AnimationArithmetic Word ProblemsCounting with Tree DiagramsCube NetsCross SectionsMotion PathMechanicsWavesLight and LensesThermodynamicsHow Semiconductors WorkMolecular StructuresAtomic OrbitalsElectrochemical CellsChemical EquilibriumCrystal LatticesBuffer pHComplex IonsDNA Double HelixCell DivisionMembrane ChannelsNerve ImpulseRock ClassificationWeatherConstellationsSolar and Lunar Eclipses3D ModelingFloor PlanSeismic StructuresIntersection TurnMaglevCooking AnimationOrigamiLive Viewer CountGeoJSON MapRailway MapPopulation MapCrime MapLand Price MapSchool MapShrine and Castle MapHouse of Representatives MapWord MapSolitaireReversiHakoiri MusumeChessHamburgerRippleSlide Puzzle MakerNeon PinballNovel MakerJapanese Typing PracticePiano Score EditorMusic Theory

English

モデルを定義して makemigrations と migrate する

Django でデータベースを扱うには、Python のクラスとしてモデルを定義し、マイグレーションという仕組みを通じてテーブルを作成します。SQL を直接書く必要はありません。

モデルの定義

モデルは models.py に記述します。django.db.models.Model を継承したクラスが 1 つのテーブルに対応し、クラス属性がカラムになります。

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    published_at = models.DateTimeField(auto_now_add=True)
    is_draft = models.BooleanField(default=True)

この例では Article というテーブルが作られ、titlebodypublished_atis_draft の 4 つのカラムが定義されます。id フィールドは Django が自動的に追加するため、明示的に書く必要はありません。

よく使うフィールド型を整理しておきましょう。

フィールド型用途備考
CharField短い文字列max_length 必須
TextField長い文字列max_length 不要
フィールド型用途備考
IntegerField整数-2147483648〜2147483647
BooleanField真偽値True / False
DateTimeField日時auto_now / auto_now_add

auto_now_add=True はレコード作成時に自動で現在時刻を設定し、auto_now=True は保存するたびに現在時刻で上書きします。作成日時と更新日時を分けたい場合は、両方を定義するのが一般的です。

class Article(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

makemigrations でマイグレーションファイルを生成する

モデルを定義・変更したら、まず makemigrations を実行します。このコマンドはモデルの変更内容を検出し、マイグレーションファイルとして記録します。

python manage.py makemigrations

実行すると、migrations/ ディレクトリに 0001_initial.py のようなファイルが生成されます。このファイルには「どんなテーブルを作るか」「どのカラムを追加・変更するか」といった情報が Python コードで記述されています。

models.py を編集する

makemigrations でマイグレーションファイル生成

migrate でデータベースに反映

マイグレーションファイルはバージョン管理の対象です。チーム開発では Git にコミットし、メンバー間でデータベースの変更履歴を共有します。

migrate でデータベースに反映する

マイグレーションファイルを作っただけでは、データベースにはまだ反映されていません。実際にテーブルを作成・変更するには migrate を実行します。

python manage.py migrate

Django は未適用のマイグレーションを順番に実行し、データベースのスキーマを更新します。どのマイグレーションが適用済みかは django_migrations テーブルで管理されているため、同じマイグレーションが二重に適用されることはありません。

マイグレーションの状態を確認する

現在のマイグレーション状況を確認するには showmigrations コマンドを使います。

python manage.py showmigrations

[X] が付いているものは適用済み、[ ] は未適用を示します。特定のアプリだけ確認したい場合は、アプリ名を引数に渡せます。

makemigrations

モデルの変更を検出してマイグレーションファイルを生成する。データベースには何も起きない

migrate

マイグレーションファイルの内容をデータベースに適用する。テーブルの作成や変更が実際に行われる

フィールドを後から追加する場合

既存のモデルにフィールドを追加すると、既存のレコードにはそのフィールドの値が存在しません。Django は makemigrations 時に「デフォルト値をどうするか」を対話的に尋ねてきます。

class Article(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    category = models.CharField(max_length=50, default='未分類')

default を指定しておけば、対話プロンプトなしでマイグレーションファイルが生成されます。null=True を設定して NULL を許容する方法もありますが、文字列フィールドでは default='' の方が Django の慣習に沿っています。

マイグレーションはデータベースの変更履歴そのものです。安易に削除や編集をせず、変更があるたびに makemigrationsmigrate のサイクルを回すことが、安全なデータベース管理の基本になります。