{"title":"はじめての Django アプリ作成、その2","version":"1.9","locale":"ja","docname":"intro/tutorial02","url":"/ja/1.9/intro/tutorial02/","canonical":"https://djangodocs.dev/ja/1.9/intro/tutorial02/","summary":"このチュートリアルはチュートリアルその 1 の続きです。ここでは、データベースをセットアップして、最初のモデルを作成し、そして Django が自動的に生成してくれる管…","html":"<h1>はじめての Django アプリ作成、その2<a class=\"heading-anchor\" href=\"#writing-your-first-django-app-part-2\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>このチュートリアルは <a class=\"reference internal\" href=\"/ja/1.9/intro/tutorial01/\"><span class=\"doc\">チュートリアルその 1</span></a> の続きです。ここでは、データベースをセットアップして、最初のモデルを作成し、そして Django が自動的に生成してくれる管理 (admin) サイトについて、簡単なイントロダクションをします。</p>\n<section id=\"database-setup\">\n<h2>Database の設定<a class=\"heading-anchor\" href=\"#database-setup\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>それでは、 <code class=\"file docutils literal notranslate\">mysite/settings.py</code> を開いてください。これは、 Django の設定を表現するモジュールレベルの変数を持つ通常の Python モジュールです。</p>\n<p>デフォルトでは、データベースとしてSQLiteを利用するように設定されています。もしあなたがデータベースに詳しくなく、もしくはDjangoに興味を持って試してみているところならば、SQLiteを利用するのが最も簡単でしょう。SQLiteはPythonに標準で組み込まれているため、データベースを利用するために何か別のものをインストールする必要がありません。ただし、あなたが実際に利用されるプロジェクトを開発するならば、いつか将来にデータベースを変更する手間を考えると、PostgreSQLのように、より堅牢なデータベースを利用したくなるでしょう。</p>\n<p>他のデータベースを使いたい場合、適当な <a class=\"reference internal\" href=\"/ja/1.9/topics/install/#database-installation\"><span class=\"std std-ref\">データベースのバインディング</span></a> をインストールして、設定ファイルの <a class=\"reference internal\" href=\"/ja/1.9/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</code></a> の``'default'`` アイテム内の以下のキーを、それぞれデータベースの接続設定に合ったものに変更してください。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/1.9/ref/settings/#std-setting-DATABASE-ENGINE\"><code class=\"xref std std-setting docutils literal notranslate\">ENGINE</code></a> -- <code class=\"docutils literal notranslate\">'django.db.backends.sqlite3'</code>、<code class=\"docutils literal notranslate\">'django.db.backends.postgresql'</code>、<code class=\"docutils literal notranslate\">'django.db.backends.mysql'</code> または <code class=\"docutils literal notranslate\">'django.db.backends.oracle'</code> のいずれかにします。<a class=\"reference internal\" href=\"/ja/1.9/ref/databases/#third-party-notes\"><span class=\"std std-ref\">その他のバックエンド</span></a> も利用可能です。</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/1.9/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\">NAME</code></a> -- データベースの名前です。SQLite を使用している場合、データベースはコンピュータ上のファイルになります。その場合、<a class=\"reference internal\" href=\"/ja/1.9/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\">NAME</code></a> には、そのファイルのファイル名を含んだ絶対パスを指定する必要があります。デフォルト値は <code class=\"docutils literal notranslate\">os.path.join(BASE_DIR, 'db.sqlite3')</code> で、ファイルはプロジェクトのディレクトリに保存されます。</p></li>\n</ul>\n<p>データベースとして SQLite を使っていない場合、 <a class=\"reference internal\" href=\"/ja/1.9/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\">USER</code></a> や <a class=\"reference internal\" href=\"/ja/1.9/ref/settings/#std-setting-PASSWORD\"><code class=\"xref std std-setting docutils literal notranslate\">PASSWORD</code></a> そして <code class=\"xref std std-setting docutils literal notranslate\">HOST などの追加設定を加える必要があります。詳細については&#160; :setting:`DATABASES</code> のリファレンスドキュメントを参照してください。</p>\n<aside class=\"admonition-for-databases-other-than-sqlite admonition\" role=\"note\">\n<p class=\"admonition-title\">SQLite 以外のデータベースの場合</p>\n<p>もし SQLite 以外を使っている場合、 database を今のうちに作っておいてください。 &quot;<code class=\"docutils literal notranslate\">CREATE DATABASE database_name;</code>&quot; とデータベースのインタラクティブプロンプトで実行してください。</p>\n<p><code class=\"file docutils literal notranslate\">mysite/settings.py</code> のデータベースユーザに 「データベース作成」の権限があることを確認します。これは、この後のチュートリアルの <a class=\"reference internal\" href=\"/ja/1.9/topics/testing/overview/#the-test-database\"><span class=\"std std-ref\">テストDB</span></a> を自動作成することができます。</p>\n<p>SQLite を使っている場合は、前もってすることはありません。必要であればデータベースファイルが自動で生成されます。</p>\n</aside>\n<p><code class=\"file docutils literal notranslate\">mysite/settings.py</code> を編集する際、 <a class=\"reference internal\" href=\"/ja/1.9/ref/settings/#std-setting-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\">TIME_ZONE</code></a> に自分のタイムゾーンも設定します。</p>\n<p>同じく、ファイル先頭にある <a class=\"reference internal\" href=\"/ja/1.9/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> に注意してください。これはこのDjangoインスタンスの中で有効化されているすべてのDjangoアプリケーションの名前を保持しています。アプリは複数のプロジェクトによって使用されることができますし、また、他の開発者が彼らのプロジェクトで使用するためにパッケージして配布することもできます。</p>\n<p>デフォルトでは、 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">:settings:`INSTALLED_APPS`</span></a> には以下のアプリケーションがはいっています。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/1.9/ref/contrib/admin/#module-django.contrib.admin\" title=\"django.contrib.admin: Django's admin site.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.admin</code></a>  - 管理（admin）サイト。まもなく使います</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/1.9/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.auth</code></a> - 認証システム</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/1.9/ref/contrib/contenttypes/#module-django.contrib.contenttypes\" title=\"django.contrib.contenttypes: Provides generic interface to installed models.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.contenttypes</code></a> - コンテンツタイプフレームワーク</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/1.9/topics/http/sessions/#module-django.contrib.sessions\" title=\"django.contrib.sessions: Provides session management for Django projects.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.sessions</code></a> - セッションフレームワーク</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/1.9/ref/contrib/messages/#module-django.contrib.messages\" title=\"django.contrib.messages: Provides cookie- and session-based temporary message storage.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.messages</code></a> - メッセージフレームワーク</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/1.9/ref/contrib/staticfiles/#module-django.contrib.staticfiles\" title=\"django.contrib.staticfiles: An app for handling static files.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.staticfiles</code></a> - 静的ファイルの管理フレームワーク</p></li>\n</ul>\n<p>これらの機能はよく使われるのでデフォルトで付属しています。</p>\n<p>これらのアプリケーションは最低1つデータベースのテーブルを使うので、使い始まる前にデータベースにテーブルを作る必要があります。以下のコマンドを実行してください:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py migrate\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/1.9/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> コマンドは <a class=\"reference internal\" href=\"/ja/1.9/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> の設定を参照するとともに、 <code class=\"file docutils literal notranslate\">mysite/settings.py</code> ファイルのデータベース設定に従って必要なすべてのデータベースのテーブルを作成します。このデータベースマイグレーションはアプリと共に配布されます  (これらについては後ほどカバーします)。マイグレーションを実施するたび、メッセージを見ることになります。もしこれに興味を引かれたら、Djangoが作成したテーブルを表示するために、コマンドラインクライアントであなたのデータベースの種類に合わせて <code class=\"docutils literal notranslate\">\\dt</code> (PostgreSQL)、<code class=\"docutils literal notranslate\">SHOW TABLES;</code> (MySQL)、 <code class=\"docutils literal notranslate\">.schema</code> (SQLite)、もしくは <code class=\"docutils literal notranslate\">SELECT TABLE_NAME FROM USER_TABLES;</code> (Oracle) とタイプしてみましょう。</p>\n<aside class=\"admonition-for-the-minimalists admonition\" role=\"note\">\n<p class=\"admonition-title\">ミニマリストのために</p>\n<p>すでに述べたように、一般的な場合のためにデフォルトのアプリケーション群が含まれていますが、すべての人がそれを必要とするわけではありません。もしその中のどれかかすべてが必要ない場合、 <a class=\"reference internal\" href=\"/ja/1.9/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> を実行する前に <a class=\"reference internal\" href=\"/ja/1.9/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> から適切な行(複数)をコメントアウトしたり削除しても構いません。<a class=\"reference internal\" href=\"/ja/1.9/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> コマンドは <a class=\"reference internal\" href=\"/ja/1.9/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> のアプリのためだけに実行されます。</p>\n</aside>\n</section>\n<section id=\"creating-models\">\n<span id=\"id1\"></span><h2>モデルの作成<a class=\"heading-anchor\" href=\"#creating-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>これからモデルを定義します -- 追加的なメタデータとともにデータベースのレイアウトを行う、必須の作業です。</p>\n<aside class=\"admonition-philosophy admonition\" role=\"note\">\n<p class=\"admonition-title\">設計哲学</p>\n<p>モデルは、手持ちのデータに対する唯一の決定的なソースです。モデルには自分が格納したいデータにとって必要不可欠なフィー ルドと、そのデータの挙動を収めます。 Django は <a class=\"reference internal\" href=\"/ja/1.9/misc/design-philosophies/#dry\"><span class=\"std std-ref\">DRY 則</span></a> に従っています。 Django のモデルの目的は、ただ一つの場所でデータモデルを定義し、そこから自動的にデータを取り出すことにあります。</p>\n<p>これはマイグレーションを含みます - 例えば、Ruby On Railsと違って、Djangoは歴史的に、現在のモデルに合致するようデータベースのスキーマをアップデートするよう進むことを可能とすることで、マイグレーションは完全にモデルのファイルから生成されます。</p>\n</aside>\n<p>これから開発する簡単な poll アプリケーションでは、投票項目 (<code class=\"docutils literal notranslate\">Question</code>) と選択肢 (<code class=\"docutils literal notranslate\">Choice</code>) の二つのモデルを作成します。 <code class=\"docutils literal notranslate\">Poll</code> には質問事項 (question) と公開日 (publication date) の情報があります。 <code class=\"docutils literal notranslate\">Choice</code> には選択肢のテキストと投票数 (vote) という二つのフィールドがあります。各 <code class=\"docutils literal notranslate\">Choice</code> は一つの <code class=\"docutils literal notranslate\">Question</code> に関連づけられています。</p>\n<p>Django では、こうした概念を簡単な Python クラスで表現できます。 <code class=\"file docutils literal notranslate\">polls/models.py</code> ファイルを以下のように編集してください:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>polls/models.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"polls/models.py\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Question</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    question_text <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    pub_date <span class=\"o\">=</span> models<span class=\"o\">.</span>DateTimeField<span class=\"p\">(</span><span class=\"s1\">&#39;date published&#39;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Choice</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    question <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Question<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    choice_text <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    votes <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">(</span>default<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>コードは単純明解ですね。各モデルは一つのクラスで表現され、いずれも <a class=\"reference internal\" href=\"/ja/1.9/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\">django.db.models.Model</code></a> のサブクラスです。各モデルには複数のクラス変数があり、個々のクラス変数はモデルのデータベースフィールドを表現しています。</p>\n<p>各フィールドは <a class=\"reference internal\" href=\"/ja/1.9/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> クラスのインスタンスとして表現されています。例えば、 <a class=\"reference internal\" href=\"/ja/1.9/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a> は文字のフィールドで、 <a class=\"reference internal\" href=\"/ja/1.9/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a> は日時フィー ルドです。こうしたクラスは、各フィールドにどのようなデータ型を記憶させるか を Django に教えます。</p>\n<p><a class=\"reference internal\" href=\"/ja/1.9/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> インスタンスそれぞれの名前(例: <code class=\"docutils literal notranslate\">question_text</code> や <code class=\"docutils literal notranslate\">pub_date</code>)は、機械可読なフィールド名です。このフィールド名はPythonコードで使うとともに、データベースも列の名前として使うことになります。</p>\n<p><a class=\"reference internal\" href=\"/ja/1.9/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> の第一固定引数には、オプションとして人間可読なフィールド名も指定できます。このフィールド名は Django の二つの内省機能で使う他、ドキュメントとしての役割も果たします。人間可読なフィールド名を指定しない場合、 Django は機械可読な名前を使います。上の例では、  <code class=\"docutils literal notranslate\">Question.pub_date</code> にだけ人間可読なフィールド名を指定しました。モデルの他のフィールドでは、フィールドの機械可読な名前は人間可読な名前としても十分なので定義していません。</p>\n<p><a class=\"reference internal\" href=\"/ja/1.9/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> クラスの中には必須の引数を持つものがありま す。例えば ~django.db.models.CharField には <a class=\"reference internal\" href=\"/ja/1.9/ref/models/fields/#django.db.models.CharField.max_length\" title=\"django.db.models.CharField.max_length\"><code class=\"xref py py-attr docutils literal notranslate\">max_length</code></a> を指定する必要があります。この引数はデータベーススキーマで使われる他、後で述べるバリデーションでも使われま す。</p>\n<p><a class=\"reference internal\" href=\"/ja/1.9/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> はいつくかオプションの引数も取れます。今回の場合、 <code class=\"docutils literal notranslate\">`votes</code> の <a class=\"reference internal\" href=\"/ja/1.9/ref/models/fields/#django.db.models.Field.default\" title=\"django.db.models.Field.default\"><code class=\"xref py py-attr docutils literal notranslate\">default</code></a> 値を 0 に設定しました。</p>\n<p>ついに、 <a class=\"reference internal\" href=\"/ja/1.9/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> を使用したリレーションシップの記述が定義されました。これは、それぞれの``Choice`` が一つの``Question``に関連付けられていることをDjangoに伝えます。Djangoは 多対一、多対多、そして一対一のような一般的なデータベースリレーションシップすべてをサポートします。</p>\n</section>\n<section id=\"activating-models\">\n<h2>モデルを有効にする<a class=\"heading-anchor\" href=\"#activating-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>前述のようなほんのわずかなコードをモデルに書くだけで、 Django はたくさんの情報を知れます。このコードを使って、 Django は:</p>\n<ul class=\"simple\">\n<li><p>アプリケーションのデータベーススキーマを作成 (<code class=\"docutils literal notranslate\">CREATE TABLE</code> 文を実行) できます。</p></li>\n<li><p><code class=\"docutils literal notranslate\">Question</code> や <code class=\"docutils literal notranslate\">Choice</code> オブジェクトに Python からアクセスするためのデータベー ス API を作成できます。</p></li>\n</ul>\n<p>でもその前に <code class=\"docutils literal notranslate\">polls</code> アプリケーションをインストールしたことをプロジェクトに教えてやる必要があります。</p>\n<aside class=\"admonition-philosophy admonition\" role=\"note\">\n<p class=\"admonition-title\">設計哲学</p>\n<p>Django アプリケーションは「プラガブル (pluggable)」です。アプリケーショ ンは特定の Django インストールに結び付いていないので、アプリケーションを複数のプロジェクトで使ったり、単体で配布したりできます。</p>\n</aside>\n<p><code class=\"file docutils literal notranslate\">mysite/settings.py</code> ファイルをもう一度編集して、 <a class=\"reference internal\" href=\"/ja/1.9/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> の設定に文字列``'polls.apps.PollsConfig'<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>が含まれるよう変更します。そうするとこのようになります:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>mysite/settings.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"mysite/settings.py\"><code>INSTALLED_APPS <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s1\">&#39;polls.apps.PollsConfig&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.admin&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.auth&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.contenttypes&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.sessions&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.messages&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.staticfiles&#39;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>これで Django は <code class=\"docutils literal notranslate\">polls</code> アプリケーションが含まれていると知りました。もうひとつコマンドを実行しましょう:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py makemigrations polls\n</code></pre></div>\n<p>次のようなものが表示されるはずです:</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>Migrations for &#39;polls&#39;:\n  0001_initial.py:\n    - Create model Choice\n    - Create model Question\n    - Add field question to choice\n</code></pre></div>\n<p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>makemigrations``を実行することで、Djangoにモデルに変更があったこと(この場合、新しいものを作成しました)を伝え、そして変更を*マイグレーション*の形で保存することができました。</p>\n<p>マイグレーションはDjangoがモデル(そしてデータベーススキーマでもあります)の変更をディスク上のファイルに保存する方法です。望むならば、新しいモデルをマイグレーションのファイル <code class=\"docutils literal notranslate\">polls/migrations/0001_initial.py</code> から読むことも出来ます。安心して下さい、Djangoが作成する度にマイグレーションのファイルを読む必要はありません、しかし、Djangoが行った変更を手動で微調整したいというときのために人間可読なファイルとして設計されています。</p>\n<p>これは自動でデータベーススキーマを管理するためのマイグレーション実行するとのコマンドです。<a class=\"reference internal\" href=\"/ja/1.9/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> と呼ばれる、あっという間に完了します、しかし最初は、マイグレーションがどんなSQLを実行するのか見てみましょう。<a class=\"reference internal\" href=\"/ja/1.9/ref/django-admin/#django-admin-sqlmigrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">sqlmigrate</code></a> コマンドはマイグレーションの名前を引数にとってSQLを返します:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py sqlmigrate polls <span class=\"m\">0001</span>\n</code></pre></div>\n<p>あなたは次のようなもの (読みやすさのためにそれを再フォーマットした) が表示されるはずです:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">BEGIN</span><span class=\"p\">;</span>\n<span class=\"c1\">--</span>\n<span class=\"c1\">-- Create model Choice</span>\n<span class=\"c1\">--</span>\n<span class=\"k\">CREATE</span> <span class=\"k\">TABLE</span> <span class=\"ss\">&quot;polls_choice&quot;</span> <span class=\"p\">(</span>\n    <span class=\"ss\">&quot;id&quot;</span> <span class=\"nb\">serial</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span> <span class=\"k\">PRIMARY</span> <span class=\"k\">KEY</span><span class=\"p\">,</span>\n    <span class=\"ss\">&quot;choice_text&quot;</span> <span class=\"nb\">varchar</span><span class=\"p\">(</span><span class=\"mi\">200</span><span class=\"p\">)</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span><span class=\"p\">,</span>\n    <span class=\"ss\">&quot;votes&quot;</span> <span class=\"nb\">integer</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span>\n<span class=\"p\">);</span>\n<span class=\"c1\">--</span>\n<span class=\"c1\">-- Create model Question</span>\n<span class=\"c1\">--</span>\n<span class=\"k\">CREATE</span> <span class=\"k\">TABLE</span> <span class=\"ss\">&quot;polls_question&quot;</span> <span class=\"p\">(</span>\n    <span class=\"ss\">&quot;id&quot;</span> <span class=\"nb\">serial</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span> <span class=\"k\">PRIMARY</span> <span class=\"k\">KEY</span><span class=\"p\">,</span>\n    <span class=\"ss\">&quot;question_text&quot;</span> <span class=\"nb\">varchar</span><span class=\"p\">(</span><span class=\"mi\">200</span><span class=\"p\">)</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span><span class=\"p\">,</span>\n    <span class=\"ss\">&quot;pub_date&quot;</span> <span class=\"k\">timestamp</span> <span class=\"k\">with</span> <span class=\"k\">time</span> <span class=\"k\">zone</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span>\n<span class=\"p\">);</span>\n<span class=\"c1\">--</span>\n<span class=\"c1\">-- Add field question to choice</span>\n<span class=\"c1\">--</span>\n<span class=\"k\">ALTER</span> <span class=\"k\">TABLE</span> <span class=\"ss\">&quot;polls_choice&quot;</span> <span class=\"k\">ADD</span> <span class=\"k\">COLUMN</span> <span class=\"ss\">&quot;question_id&quot;</span> <span class=\"nb\">integer</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span><span class=\"p\">;</span>\n<span class=\"k\">ALTER</span> <span class=\"k\">TABLE</span> <span class=\"ss\">&quot;polls_choice&quot;</span> <span class=\"k\">ALTER</span> <span class=\"k\">COLUMN</span> <span class=\"ss\">&quot;question_id&quot;</span> <span class=\"k\">DROP</span> <span class=\"k\">DEFAULT</span><span class=\"p\">;</span>\n<span class=\"k\">CREATE</span> <span class=\"k\">INDEX</span> <span class=\"ss\">&quot;polls_choice_7aa0f6ee&quot;</span> <span class=\"k\">ON</span> <span class=\"ss\">&quot;polls_choice&quot;</span> <span class=\"p\">(</span><span class=\"ss\">&quot;question_id&quot;</span><span class=\"p\">);</span>\n<span class=\"k\">ALTER</span> <span class=\"k\">TABLE</span> <span class=\"ss\">&quot;polls_choice&quot;</span>\n  <span class=\"k\">ADD</span> <span class=\"k\">CONSTRAINT</span> <span class=\"ss\">&quot;polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id&quot;</span>\n    <span class=\"k\">FOREIGN</span> <span class=\"k\">KEY</span> <span class=\"p\">(</span><span class=\"ss\">&quot;question_id&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">REFERENCES</span> <span class=\"ss\">&quot;polls_question&quot;</span> <span class=\"p\">(</span><span class=\"ss\">&quot;id&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">DEFERRABLE</span> <span class=\"k\">INITIALLY</span> <span class=\"k\">DEFERRED</span><span class=\"p\">;</span>\n\n<span class=\"k\">COMMIT</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>以下に注意してください:</p>\n<ul class=\"simple\">\n<li><p>正確な出力は、使用しているデータベースによって異なります。上記の例では、 PostgreSQL のために生成されます。</p></li>\n<li><p>テーブル名はアプリケーションの名前 (<code class=\"docutils literal notranslate\">polls</code>) とモデルの小文字表記 の <code class=\"docutils literal notranslate\">question</code>  と <code class=\"docutils literal notranslate\">choice</code> を組み合わせて自動的に生成されます。 (この挙動はオーバライドできます)</p></li>\n<li><p>主キー (primary key, ID) は自動的に追加されます (この挙動もオーバライド可能です)。</p></li>\n<li><p>便宜上、 Django は外部キーのフィールド名に <code class=\"docutils literal notranslate\">&quot;_id&quot;</code> を追加します。もちろんこの挙動もオーバライド可能です。</p></li>\n<li><p>外部キーリレーションシップは``FOREIGN KEY`` 制約で明確化されます。<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>DEFERRABLE``の部分については心配しないでください; これはただPostgreSQLに外部キーをトランザクション終了まで強制しないよう伝えているだけです。</p></li>\n<li><p>これはあなたが使用しているデータベースに合わせて、<code class=\"docutils literal notranslate\">auto_increment</code> (MySQL)、 <code class=\"docutils literal notranslate\">serial</code> (PostgreSQL) もしくは integer primary key autoincrement` (SQLite) のようなデータベースに特化した型が自動的に選択され生成されます。フィールド名のクォーティングをダブルクォートにするか、シングルクォートにするかも同じように扱われます。</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/1.9/ref/django-admin/#django-admin-sqlmigrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">sqlmigrate</code></a> コマンドは実際にはデータベースにマイグレーションを実行しません。ただ、Djangoが必要としているSQLが何であるかをスクリーンに表示するだけです。これはDjangoが何をしようとしているかを確認したり、データベース管理者に変更のためのSQLスクリプトを要求されているときに役に立ちます。</p></li>\n</ul>\n<p>もし興味があれば <a class=\"reference internal\" href=\"/ja/1.9/ref/django-admin/#django-admin-check\"><code class=\"xref std std-djadmin docutils literal notranslate\">python manage.py check</code></a> を実行することもできます; これはマイグレーションを作成したりデータベースにふれることなくプロジェクトになんの問題がないか確認します 。</p>\n<p><a class=\"reference internal\" href=\"/ja/1.9/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> を再度実行し、 モデルのテーブルをデータベースに作成しましょう。</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py migrate\n<span class=\"go\">Operations to perform:</span>\n<span class=\"go\">  Apply all migrations: admin, contenttypes, polls, auth, sessions</span>\n<span class=\"go\">Running migrations:</span>\n<span class=\"go\">  Rendering model states... DONE</span>\n<span class=\"go\">  Applying polls.0001_initial... OK</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/1.9/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> コマンドはすべての適用されていないマイグレーション(Djangoはデータベース内の``django_migrations``と呼ばれる特別なテーブルを利用してどれが適用されているかを追跡しています)を捕捉してデータベースに対してそれを実行します - 重要なのは、モデルに対して行った変更はデータベースのスキーマに同期するということです。</p>\n<p>マイグレーションは、データベースやテーブルを削除しまた新しいものを作成する必要なく、プロジェクトを開発するように、いつでもモデルを変更可能とする強力なツールです - データを失うことなしにデータベースをライブでアップグレードするよう特化しています。これらについてチュートリアルの後の部分でより深くカバーします、しかし今は、モデルの変更を実施するための3ステップガイドを覚えておいてください:</p>\n<ul class=\"simple\">\n<li><p>モデルを変更する (<code class=\"docutils literal notranslate\">models.py</code> の中の)</p></li>\n<li><p>これらの変更のためのマイグレーションを作成するために <a class=\"reference internal\" href=\"/ja/1.9/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">python manage.py makemigrations</code></a>  を実行します。</p></li>\n<li><p>データベースにこれらの変更を適用するために <a class=\"reference internal\" href=\"/ja/1.9/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">python manage.py migrate</code></a>  を実行します。</p></li>\n</ul>\n<p>マイグレーションの作成と適用のコマンドが分割されている理由は、マイグレーションをバージョン管理システムにコミットし、アプリとともに配布するためです。これによって、あなたの開発が容易になるだけでなく、他の開発者や本番環境にとって使いやすいものになります。</p>\n<p><code class=\"docutils literal notranslate\">manage.py</code> ユーティリティでできることについては <a class=\"reference internal\" href=\"/ja/1.9/ref/django-admin/\"><span class=\"doc\">django-admin のドキュメント</span></a> を読んで下さい。</p>\n</section>\n<section id=\"playing-with-the-api\">\n<h2>API で遊んでみる<a class=\"heading-anchor\" href=\"#playing-with-the-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>さぁ、 Python 対話シェルを起動して、 Django が提供する API で遊んでみましょう。 Python シェルを起動するには、以下のコマンドを実行します:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py shell\n</code></pre></div>\n<p>単に “python” を実行しないのは、 Django に <code class=\"file docutils literal notranslate\">mysite/settings.py</code> ファイルへの import パスを与える <code class=\"docutils literal notranslate\">DJANGO_SETTINGS_MODULE</code> の環境変数を <code class=\"file docutils literal notranslate\">manage.py</code> で設定しているからです。</p>\n<aside class=\"admonition-bypassing-manage-py admonition\" role=\"note\">\n<p class=\"admonition-title\">manage.py を使わずに済ませる方法</p>\n<p><code class=\"file docutils literal notranslate\">manage.py</code> を使用しなくても問題ありません。環境変数 <span class=\"target\" id=\"index-2\"></span><a class=\"reference internal\" href=\"/ja/1.9/topics/settings/#envvar-DJANGO_SETTINGS_MODULE\"><code class=\"xref std std-envvar docutils literal notranslate\">DJANGO_SETTINGS_MODULE</code></a> を <code class=\"docutils literal notranslate\">mysite.settings</code> に設定して、標準のPython shellを起動しDjangoをセットアップします。</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span> <span class=\"nn\">django</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>django<span class=\"o\">.</span>setup<span class=\"p\">()</span>\n</code></pre></div>\n<p><a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#AttributeError\" title=\"(in Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\">AttributeError</code></a> が発生したするのであれば、おそらくこのチュートリアルに合致しないDjangoを使用しているのでしょう。より古いチュートリアルに切り替えるか、Djangoのバージョンを新しくして下さい。</p>\n<p><code class=\"docutils literal notranslate\">import mysite</code> の動作のために、<code class=\"file docutils literal notranslate\">manage.py</code> があるのと同じディレクトリ、もしくはPythonのパスが通っていることを保証されたディレクトリから``python``を実行しなくてはなりません。</p>\n<p>詳しくは <a class=\"reference internal\" href=\"/ja/1.9/ref/django-admin/\"><span class=\"doc\">django-admin.py のドキュメント</span></a> を参照してください。</p>\n</aside>\n<p>シェルに入ったら <a class=\"reference internal\" href=\"/ja/1.9/topics/db/queries/\"><span class=\"doc\">データベース API</span></a> の世界を探検してみましょう:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">polls.models</span> <span class=\"kn\">import</span> Question<span class=\"p\">,</span> Choice   <span class=\"c1\"># Import the model classes we just wrote.</span>\n\n<span class=\"go\"># No questions are in the system yet.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">[]</span>\n\n<span class=\"go\"># Create a new Question.</span>\n<span class=\"go\"># Support for time zones is enabled in the default settings file, so</span>\n<span class=\"go\"># Django expects a datetime with tzinfo for pub_date. Use timezone.now()</span>\n<span class=\"go\"># instead of datetime.datetime.now() and it will do the right thing.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\n<span class=\"gp\">&gt;&gt;&gt; </span>q <span class=\"o\">=</span> Question<span class=\"p\">(</span>question_text<span class=\"o\">=</span><span class=\"s2\">&quot;What&#39;s new?&quot;</span><span class=\"p\">,</span> pub_date<span class=\"o\">=</span>timezone<span class=\"o\">.</span>now<span class=\"p\">())</span>\n\n<span class=\"go\"># Save the object into the database. You have to call save() explicitly.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\n<span class=\"go\"># Now it has an ID. Note that this might say &quot;1L&quot; instead of &quot;1&quot;, depending</span>\n<span class=\"go\"># on which database you&#39;re using. That&#39;s no biggie; it just means your</span>\n<span class=\"go\"># database backend prefers to return integers as Python long integer</span>\n<span class=\"go\"># objects.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>id\n<span class=\"go\">1</span>\n\n<span class=\"go\"># Access model field values via Python attributes.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>question_text\n<span class=\"go\">&quot;What&#39;s new?&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>pub_date\n<span class=\"go\">datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=&lt;UTC&gt;)</span>\n\n<span class=\"go\"># Change values by changing the attributes, then calling save().</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>question_text <span class=\"o\">=</span> <span class=\"s2\">&quot;What&#39;s up?&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\n<span class=\"go\"># objects.all() displays all the questions in the database.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">[&lt;Question: Question object&gt;]</span>\n</code></pre></div>\n<p>ちょっと待ってください。 <code class=\"docutils literal notranslate\">&lt;Question: Question object&gt;``はこのオブジェクトの表現としてまったく役に立ちません。(``polls/models.py</code> ファイルの中にある) <code class=\"docutils literal notranslate\">Question``モデルを編集してこれを修正しましょう。:meth:`~django.db.models.Model.__str__` メソッドを``Question</code> と <code class=\"docutils literal notranslate\">Choice</code> の両方に追加します:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>polls/models.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"polls/models.py\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.encoding</span> <span class=\"kn\">import</span> python_2_unicode_compatible\n\n<span class=\"nd\">@python_2_unicode_compatible</span>  <span class=\"c1\"># only if you need to support Python 2</span>\n<span class=\"k\">class</span> <span class=\"nc\">Question</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>question_text\n\n<span class=\"nd\">@python_2_unicode_compatible</span>  <span class=\"c1\"># only if you need to support Python 2</span>\n<span class=\"k\">class</span> <span class=\"nc\">Choice</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>choice_text\n</code></pre></figure>\n<p>あなた自身のインタラクティブシェルでの表示での利便性のためだけではなく、Djangoの自動生成adminでオブジェクトの表現として使用されるという理由からも <a class=\"reference internal\" href=\"/ja/1.9/ref/models/instances/#django.db.models.Model.__str__\" title=\"django.db.models.Model.__str__\"><code class=\"xref py py-meth docutils literal notranslate\">__str__()</code></a> メソッドをモデルに追加することは重要です。</p>\n<p>これらは通常の Python メソッドということに注意してください。デモ用にカスタムのメソッドを追加してみましょう:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>polls/models.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"polls/models.py\"><code><span class=\"kn\">import</span> <span class=\"nn\">datetime</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Question</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">def</span> <span class=\"nf\">was_published_recently</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>pub_date <span class=\"o\">&gt;=</span> timezone<span class=\"o\">.</span>now<span class=\"p\">()</span> <span class=\"o\">-</span> datetime<span class=\"o\">.</span>timedelta<span class=\"p\">(</span>days<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p><code class=\"docutils literal notranslate\">import datetime</code> と <code class=\"docutils literal notranslate\">from django.utils import timezone</code> で Python の 標準モジュール <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#module-datetime\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\">datetime</code></a> と Django のタイムゾーン関連ユーティリティの <a class=\"reference internal\" href=\"/ja/1.9/ref/utils/#module-django.utils.timezone\" title=\"django.utils.timezone: Timezone support.\"><code class=\"xref py py-mod docutils literal notranslate\">django.utils.timezone</code></a> を参照していることに注意してください。 Python でのタイムゾーンの取り扱いに不慣れな場合は、 タイムゾーンサポートドキュメント &lt;/topics/i18n/timezones&gt; を参照してください。</p>\n<p>変更を保存して、もう一度 <code class=\"docutils literal notranslate\">python manage.py shell</code> を実行して新しい Python 対話シェルを始めましょう:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">polls.models</span> <span class=\"kn\">import</span> Question<span class=\"p\">,</span> Choice\n\n<span class=\"go\"># Make sure our __str__() addition worked.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">[&lt;Question: What&#39;s up?&gt;]</span>\n\n<span class=\"go\"># Django provides a rich database lookup API that&#39;s entirely driven by</span>\n<span class=\"go\"># keyword arguments.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">[&lt;Question: What&#39;s up?&gt;]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>question_text__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;What&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[&lt;Question: What&#39;s up?&gt;]</span>\n\n<span class=\"go\"># Get the question that was published this year.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\n<span class=\"gp\">&gt;&gt;&gt; </span>current_year <span class=\"o\">=</span> timezone<span class=\"o\">.</span>now<span class=\"p\">()</span><span class=\"o\">.</span>year\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pub_date__year<span class=\"o\">=</span>current_year<span class=\"p\">)</span>\n<span class=\"go\">&lt;Question: What&#39;s up?&gt;</span>\n\n<span class=\"go\"># Request an ID that doesn&#39;t exist, this will raise an exception.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n    <span class=\"o\">...</span>\n<span class=\"gr\">DoesNotExist</span>: Question matching query does not exist.\n\n<span class=\"x\"># Lookup by a primary key is the most common case, so Django provides a</span>\n<span class=\"x\"># shortcut for primary-key exact lookups.</span>\n<span class=\"x\"># The following is identical to Question.objects.get(id=1).</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Question: What&#39;s up?&gt;</span>\n\n<span class=\"go\"># Make sure our custom method worked.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q <span class=\"o\">=</span> Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>was_published_recently<span class=\"p\">()</span>\n<span class=\"go\">True</span>\n\n<span class=\"go\"># Give the Question a couple of Choices. The create call constructs a new</span>\n<span class=\"go\"># Choice object, does the INSERT statement, adds the choice to the set</span>\n<span class=\"go\"># of available choices and returns the new Choice object. Django creates</span>\n<span class=\"go\"># a set to hold the &quot;other side&quot; of a ForeignKey relation</span>\n<span class=\"go\"># (e.g. a question&#39;s choice) which can be accessed via the API.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q <span class=\"o\">=</span> Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Display any choices from the related object set -- none so far.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">[]</span>\n\n<span class=\"go\"># Create three choices.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>create<span class=\"p\">(</span>choice_text<span class=\"o\">=</span><span class=\"s1\">&#39;Not much&#39;</span><span class=\"p\">,</span> votes<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Choice: Not much&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>create<span class=\"p\">(</span>choice_text<span class=\"o\">=</span><span class=\"s1\">&#39;The sky&#39;</span><span class=\"p\">,</span> votes<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Choice: The sky&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>c <span class=\"o\">=</span> q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>create<span class=\"p\">(</span>choice_text<span class=\"o\">=</span><span class=\"s1\">&#39;Just hacking again&#39;</span><span class=\"p\">,</span> votes<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Choice objects have API access to their related Question objects.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>c<span class=\"o\">.</span>question\n<span class=\"go\">&lt;Question: What&#39;s up?&gt;</span>\n\n<span class=\"go\"># And vice versa: Question objects get access to Choice objects.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">[&lt;Choice: Not much&gt;, &lt;Choice: The sky&gt;, &lt;Choice: Just hacking again&gt;]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>count<span class=\"p\">()</span>\n<span class=\"go\">3</span>\n\n<span class=\"go\"># The API automatically follows relationships as far as you need.</span>\n<span class=\"go\"># Use double underscores to separate relationships.</span>\n<span class=\"go\"># This works as many levels deep as you want; there&#39;s no limit.</span>\n<span class=\"go\"># Find all Choices for any question whose pub_date is in this year</span>\n<span class=\"go\"># (reusing the &#39;current_year&#39; variable we created above).</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Choice<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>question__pub_date__year<span class=\"o\">=</span>current_year<span class=\"p\">)</span>\n<span class=\"go\">[&lt;Choice: Not much&gt;, &lt;Choice: The sky&gt;, &lt;Choice: Just hacking again&gt;]</span>\n\n<span class=\"go\"># Let&#39;s delete one of the choices. Use delete() for that.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>c <span class=\"o\">=</span> q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>filter<span class=\"p\">(</span>choice_text__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;Just hacking&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>c<span class=\"o\">.</span>delete<span class=\"p\">()</span>\n</code></pre></div>\n<p>モデルのリレーションについては <a class=\"reference internal\" href=\"/ja/1.9/ref/models/relations/\"><span class=\"doc\">リレーション先オブジェクトにアクセスする</span></a> を参照してください。 API を通じた、フィールドルックアップのためのダブルアンダースコアの使い方は <a class=\"reference internal\" href=\"/ja/1.9/topics/db/queries/#field-lookups-intro\"><span class=\"std std-ref\">フィールドルックアップ</span></a> を参照してください。データーベース API の詳細は <a class=\"reference internal\" href=\"/ja/1.9/topics/db/queries/\"><span class=\"doc\">データベース API リファレンス</span></a> を参照してください。</p>\n</section>\n<section id=\"introducing-the-django-admin\">\n<h2>Django Adminの紹介<a class=\"heading-anchor\" href=\"#introducing-the-django-admin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"admonition-philosophy admonition\" role=\"note\">\n<p class=\"admonition-title\">設計哲学</p>\n<p>あなたのスタッフや顧客のためのコンテンツ追加、変更そして削除のための管理サイトの生成は、創造性を要求されない退屈な仕事です。そのため、Djangoはモデルのための管理インタフェース群の生成を完全に自動化します。</p>\n<p>Django はニュースルーム環境で開発されました。ニュースルーム環境では、 「コンテンツの作成者 (content publisher)」と「公開 (public) 」サイトをきわめて明確に区別しています。サイト管理者は新たな話題やイベント、 スポーツのスコアなどの入力にシステムを使い、コンテンツは公開用サイト上で表示されます。 Django は、サイト管理者向けの一元化されたコンテンツ編集インタフェースを提供しています。</p>\n<p>admin はサイトの訪問者でなく、サイト管理者に使われることを意図しています。</p>\n</aside>\n<section id=\"creating-an-admin-user\">\n<h3>管理ユーザーを作成する<a class=\"heading-anchor\" href=\"#creating-an-admin-user\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>まず最初に私達はadminサイトにログインできるユーザーを作成する必要があります。下記のコマンドを実行します:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py createsuperuser\n</code></pre></div>\n<p>好きなユーザー名を入力しEnterを押してください。</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>Username: admin\n</code></pre></div>\n<p>希望するemailアドレスを入力するよう促されます:</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>Email address: admin@example.com\n</code></pre></div>\n<p>最後のステップはパスワードの入力です。2回目のパスワードが1回目と同じことを確認するため、パスワードの入力を2回求められます。</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>Password: **********\nPassword (again): *********\nSuperuser created successfully.\n</code></pre></div>\n</section>\n<section id=\"start-the-development-server\">\n<h3>開発サーバーの起動<a class=\"heading-anchor\" href=\"#start-the-development-server\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django adminサイトはデフォルトで有効化されます。開発サーバーを起動して探索を始めましょう。</p>\n<p>もしサーバーが起動していなかったら、このようにして起動しましょう:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py runserver\n</code></pre></div>\n<p>次はブラウザを起動して、ローカルドメインの “/admin/” 、つまり <a class=\"reference external\" href=\"http://127.0.0.1:8000/admin/\">http://127.0.0.1:8000/admin/</a> にアクセスします。以下のような admin のログイ ン画面が表示されるはずです:</p>\n<img alt=\"Django admin login screen\" src=\"/ja/1.9/_images/admin01.png\" />\n<p>:doc:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>translation &lt;/topics/i18n/translation&gt;`はデフォルトでonになっています。 あなたのブラウザの設定とDjangoの翻訳状況によって、ログインスクリーンはあなたの言語で表示されるかもしれません。</p>\n</section>\n<section id=\"enter-the-admin-site\">\n<h3>admin サイトに入る<a class=\"heading-anchor\" href=\"#enter-the-admin-site\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>今回は、前のステップで作成したスーパーユーザーのアカウントでログインを試してみましょう。Django adminのインデックスページが表示されるはずです:</p>\n<img alt=\"Django admin index page\" src=\"/ja/1.9/_images/admin02.png\" />\n<p>groupsとusersといういくつかのタイプの編集可能なコンテンツが閲覧できるはずです。これらはDjangoに含まれる認証フレームワーク <a class=\"reference internal\" href=\"/ja/1.9/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.auth</code></a> によって提供されます。</p>\n</section>\n<section id=\"make-the-poll-app-modifiable-in-the-admin\">\n<h3>Poll アプリを admin 上で編集できるようにする<a class=\"heading-anchor\" href=\"#make-the-poll-app-modifiable-in-the-admin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>ところで、 polls アプリはどこにあるんでしょう？ admin のインデクスページを見ても表示されていませんね。</p>\n<p>やるべきことは一つです: adminに&quot;Question&quot;オブジェクト達はadmin インタフェースを持つことを伝える必要があります。これを行うために、ファイル  <code class=\"file docutils literal notranslate\">polls/admin.py</code> を開いてこのように編集しましょう:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>polls/admin.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"polls/admin.py\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> Question\n\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Question<span class=\"p\">)</span>\n</code></pre></figure>\n</section>\n<section id=\"explore-the-free-admin-functionality\">\n<h3>admin の機能を探究してみる<a class=\"heading-anchor\" href=\"#explore-the-free-admin-functionality\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>今では私たちが&quot;Question&quot;を登録したので、Djangoはadmin インデクスページにこれを表示すべきだということを知っています:</p>\n<img alt=\"Django admin index page, now with polls displayed\" src=\"/ja/1.9/_images/admin03t.png\" />\n<p>&quot;Questions&quot;をクリックしましょう。questionsのための&quot;change list&quot;ページが表示されます。このページにはデータベースの中のすべてのquestionsが表示され、あなたはこの中のひとつを変更のために選択することができます。ここに私たちが以前作成した&quot;What's UP?&quot; questionもあります:</p>\n<img alt=\"Polls change list page\" src=\"/ja/1.9/_images/admin04t.png\" />\n<p>&quot;What's up?&quot; questionを編集するためにクリックしましょう:</p>\n<img alt=\"Editing form for question object\" src=\"/ja/1.9/_images/admin05t.png\" />\n<p>以下の点に注意してください:</p>\n<ul class=\"simple\">\n<li><p>フォームは <code class=\"docutils literal notranslate\">Question</code> モデルから自動的に生成されます。</p></li>\n<li><p>モデルのフィールドの型 (<a class=\"reference internal\" href=\"/ja/1.9/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a> 、 <a class=\"reference internal\" href=\"/ja/1.9/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a> など) によって適切な HTML 入力ウィジェッ トが対応しています。各種のフィールドには Django 管理サイトでデー タを表示する方法が定義されています。</p></li>\n<li><p>各 <a class=\"reference internal\" href=\"/ja/1.9/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a> は JavaScript ショートカットがついています。日付 (dates) のカラムには「今日 (today)」 へのショートカットとカレンダーポップアップボタンがあります。 時刻 (times) には「現在 (now)」へのショートカットと、よく入力される時刻のリストを表示するポップアップボタンがあります。</p></li>\n</ul>\n<p>ページの末尾の部分には操作ボタンがいくつか表示されています:</p>\n<ul class=\"simple\">\n<li><p>保存 (Save) – 変更を保存して、このモデルのチェンジリストのページに戻ります。</p></li>\n<li><p>保存して編集を続ける (Save and continue editing) – 変更を保存して、このオブジェクトの編集ページをリロードします。</p></li>\n<li><p>保存してもう一つ追加 (Save and add another) – 変更を保存して、このモデルのオブジェクトを新規追加するための空の編集ページをロードします。</p></li>\n<li><p>削除 (Delete) – 削除確認ページを表示します。</p></li>\n</ul>\n<p>もし「Data published」の値があなたが以前 <a class=\"reference internal\" href=\"/ja/1.9/intro/tutorial01/\"><span class=\"doc\">チュートリアルその1</span></a> で作成した questionと一致しないのであれば、それはおそらくあなたが <a class=\"reference internal\" href=\"/ja/1.9/ref/settings/#std-setting-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\">TIME_ZONE</code></a>  で正しい値を設定することを忘れていたことを意味します。これを変更して、ページをリロードし、正しい値が表示されるかチェックします。</p>\n<p>「今日」や「現在」ショートカットをクリックして、「Date published」を変更してみましょう。変更したら、「保存して編集を続ける」を押します。次に、右上に ある「履歴 (History)」をクリックしてみましょう。ユーザが管理サイト上でオブジェクトに対して行った変更履歴の全てを、変更時刻と変更を行ったユーザ名付きでリストにしたページが表示されます:</p>\n<img alt=\"History page for question object\" src=\"/ja/1.9/_images/admin06t.png\" />\n<p>モデルのAPIや、あなた自身で親しみやすくしたadmin サイトが方があった方が具合がいいと思うときは、polls アプリにより多くのビュー追加する方法を学習するため <a class=\"reference internal\" href=\"/ja/1.9/intro/tutorial03/\"><span class=\"doc\">チュートリアルその3</span></a> を読みましょう。</p>\n</section>\n</section>","rootId":"writing-your-first-django-app-part-2","toc":[{"title":"Database の設定","anchor":"database-setup","children":[]},{"title":"モデルの作成","anchor":"creating-models","children":[]},{"title":"モデルを有効にする","anchor":"activating-models","children":[]},{"title":"API で遊んでみる","anchor":"playing-with-the-api","children":[]},{"title":"Django Adminの紹介","anchor":"introducing-the-django-admin","children":[{"title":"管理ユーザーを作成する","anchor":"creating-an-admin-user","children":[]},{"title":"開発サーバーの起動","anchor":"start-the-development-server","children":[]},{"title":"admin サイトに入る","anchor":"enter-the-admin-site","children":[]},{"title":"Poll アプリを admin 上で編集できるようにする","anchor":"make-the-poll-app-modifiable-in-the-admin","children":[]},{"title":"admin の機能を探究してみる","anchor":"explore-the-free-admin-functionality","children":[]}]}],"breadcrumbs":[{"docname":"intro/index","title":"さぁ始めましょう。","url":"/ja/1.9/intro/"}],"prev":{"docname":"intro/tutorial01","title":"はじめての Django アプリ作成、その 1","url":"/ja/1.9/intro/tutorial01/"},"next":{"docname":"intro/tutorial03","title":"はじめての Django アプリ作成、その 3","url":"/ja/1.9/intro/tutorial03/"},"formats":{"html":"/ja/1.9/intro/tutorial02/","markdown":"/ja/1.9/intro/tutorial02.md","json":"/ja/1.9/intro/tutorial02.json"},"source":"https://github.com/django/django/blob/stable/1.9.x/docs/intro/tutorial02.txt","official":"https://docs.djangoproject.com/ja/1.9/intro/tutorial02/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","fr","ja","id","pt-br","es"]}