{"title":"はじめての Django アプリ作成、その 2","version":"6.1","locale":"ja","docname":"intro/tutorial02","url":"/ja/6.1/intro/tutorial02/","canonical":"https://djangodocs.dev/ja/6.1/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/6.1/intro/tutorial01/\"><span class=\"doc\">チュートリアルその 1</span></a> の続きです。ここでは、データベースをセットアップして、最初のモデルを作成し、そして Django が自動的に生成してくれる管理サイトについて、簡単なイントロダクションをします。</p>\n<aside class=\"admonition-where-to-get-help admonition\" role=\"note\">\n<p class=\"admonition-title\">困ったときは:</p>\n<p>このチュートリアルの実行に問題がある場合は、FAQ の <a class=\"reference internal\" href=\"/ja/6.1/faq/help/\"><span class=\"doc\">Getting Help</span></a> セクションに進んでください。</p>\n</aside>\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>デフォルトでは、<a class=\"reference internal\" href=\"/ja/6.1/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</code></a> の設定はSQLiteを使用します。もしデータベースに不慣れであったり、Djangoを試してみたいだけの場合、これが最も簡単な選択です。SQLiteはPythonに含まれているため、データベースをサポートするために追加でインストールする必要はありません。ただし、最初の本格的なプロジェクトを始める際には、将来的なデータベースの切り替えに悩まされないよう、PostgreSQLのようなよりスケーラブルなデータベースを使用したいと思うかもしれません。</p>\n<p>別のデータベースを使用したい場合は、<a class=\"reference internal\" href=\"/ja/6.1/topics/install/#database-installation\"><span class=\"std std-ref\">データベースのカスタマイズと実行に関する詳細</span></a> を参照してください。</p>\n<p><code class=\"file docutils literal notranslate\">mysite/settings.py</code> を編集する際、 <a class=\"reference internal\" href=\"/ja/6.1/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/6.1/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 class=\"reference internal\" href=\"/ja/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> には以下のアプリケーションが入っています。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/6.1/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/6.1/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/6.1/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/6.1/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/6.1/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/6.1/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=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><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</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py migrate\n</code></pre></div></div></div>\n<p><a class=\"reference internal\" href=\"/ja/6.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> コマンドは <a class=\"reference internal\" href=\"/ja/6.1/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\">.tables</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/6.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> を実行する前に <a class=\"reference internal\" href=\"/ja/6.1/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/6.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> コマンドは <a class=\"reference internal\" href=\"/ja/6.1/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/6.1/misc/design-philosophies/#dry\"><span class=\"std std-ref\">DRY 則</span></a> に従っています。 Django のモデルの目的は、ただ一つの場所でデータモデルを定義し、そこから自動的にデータを取り出すことにあります。</p>\n<p>This includes the migrations, which are derived from your models file.\nThey form a history that Django uses to update your database schema\nto match your current models.</p>\n</aside>\n<p>これから開発する簡単な poll アプリケーションでは、<code class=\"docutils literal notranslate\">Question</code> と <code class=\"docutils literal notranslate\">Choice</code> の2つのモデルを作成します。<code class=\"docutils literal notranslate\">Question</code> には質問文と公開日時があります。 <code class=\"docutils literal notranslate\">Choice</code> には選択肢のテキストと vote という2つのフィールドがあります。各 <code class=\"docutils literal notranslate\">Choice</code> は1つの <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=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/models.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><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=\"s2\">&quot;date published&quot;</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/6.1/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/6.1/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/6.1/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/6.1/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/6.1/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/6.1/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/6.1/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/6.1/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/6.1/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/6.1/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/6.1/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/6.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> を使用してリレーションシップが定義されていることに注目してください。これは、それぞれの <code class=\"docutils literal notranslate\">Choice</code> が一つの <code class=\"docutils literal notranslate\">Question</code> に関連付けられることを 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>アプリケーションをプロジェクトに含めるには、構成クラスへの参照を <a class=\"reference internal\" href=\"/ja/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 設定に追加する必要があります。 <code class=\"docutils literal notranslate\">PollsConfig</code> クラスは、 <code class=\"file docutils literal notranslate\">polls/apps.py</code> にあるので、ドットつなぎのパスは <code class=\"docutils literal notranslate\">'polls.apps.PollsConfig'</code> となります。 <code class=\"file docutils literal notranslate\">mysite/settings.py</code> を編集し、 <a class=\"reference internal\" href=\"/ja/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 設定にドットつなぎのパスを追加してください。そうすると下記のようになります。</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">mysite/settings.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><code>INSTALLED_APPS <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;polls.apps.PollsConfig&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.admin&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.auth&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.contenttypes&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.sessions&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.messages&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.staticfiles&quot;</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=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-1-unix-label\">Linux / macOS</p><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</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-1-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py makemigrations polls\n</code></pre></div></div></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  polls/migrations/0001_initial.py\n    + Create model Question\n    + Create model Choice\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">makemigrations</code> を実行することで、Djangoにモデルに変更があったこと(この場合、新しいものを作成しました)を伝え、そして変更を <em>マイグレーション</em> の形で保存することができました。</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/6.1/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/6.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> を再度実行し、 モデルのテーブルをデータベースに作成しましょう。</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-2-unix-label\">Linux / macOS</p><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, auth, contenttypes, polls, sessions</span>\n<span class=\"go\">Running migrations:</span>\n<span class=\"go\">  Applying polls.0001_initial... OK</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-2-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py migrate\n<span class=\"go\">Operations to perform:</span>\n<span class=\"go\">  Apply all migrations: admin, auth, contenttypes, polls, sessions</span>\n<span class=\"go\">Running migrations:</span>\n<span class=\"go\">  Applying polls.0001_initial... OK</span>\n</code></pre></div></div></div>\n<p><a class=\"reference internal\" href=\"/ja/6.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> コマンドはすべての適用されていないマイグレーション(Djangoはデータベース内の <code class=\"docutils literal notranslate\">django_migrations</code> と呼ばれる特別なテーブルを利用してどれが適用されているかを追跡しています)を捕捉してデータベースに対してそれを実行します - 重要なのは、モデルに対して行った変更はデータベースのスキーマに同期するということです。</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>Run <a class=\"reference internal\" href=\"/ja/6.1/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">python manage.py makemigrations</code></a> to create\nmigrations for those changes.</p></li>\n<li><p>データベースにこれらの変更を適用するために <a class=\"reference internal\" href=\"/ja/6.1/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>See <a class=\"reference internal\" href=\"/ja/6.1/topics/migrations/\"><span class=\"doc\">マイグレーション</span></a> for the full details, including how to inspect\nthe SQL a migration will run with <a class=\"reference internal\" href=\"/ja/6.1/ref/django-admin/#django-admin-sqlmigrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">sqlmigrate</code></a> (see\n<a class=\"reference internal\" href=\"/ja/6.1/topics/migrations/#executing-sqlmigrate\"><span class=\"std std-ref\">Executing sqlmigrate</span></a>).</p>\n<p><code class=\"docutils literal notranslate\">manage.py</code> ユーティリティでできることについては <a class=\"reference internal\" href=\"/ja/6.1/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=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-3-unix-label\">Linux / macOS</p><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</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-3-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py shell\n</code></pre></div></div></div>\n<p>単に &quot;python &quot;とタイプするのではなく、上記のコマンドを使います。なぜなら、 <code class=\"file docutils literal notranslate\">manage.py</code> は <span class=\"target\" id=\"index-2\"></span><a class=\"reference internal\" href=\"/ja/6.1/topics/settings/#envvar-DJANGO_SETTINGS_MODULE\"><code class=\"xref std std-envvar docutils literal notranslate\">DJANGO_SETTINGS_MODULE</code></a> 環境変数を設定しているからです。通常、 <a class=\"reference internal\" href=\"/ja/6.1/ref/django-admin/#django-admin-shell\"><code class=\"xref std std-djadmin docutils literal notranslate\">shell</code></a> コマンドは <a class=\"reference internal\" href=\"/ja/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> からモデルを自動的にインポートします。</p>\n<p>シェルに入ったら <a class=\"reference internal\" href=\"/ja/6.1/topics/db/queries/\"><span class=\"doc\">データベース API</span></a> の世界を探検してみましょう:</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=\"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\">&lt;QuerySet []&gt;</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.</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=datetime.UTC)</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;QuerySet [&lt;Question: Question object (1)&gt;]&gt;</span>\n</code></pre></div>\n<p>ちょっと待ってください。 <code class=\"docutils literal notranslate\">&lt;Question: Question object (1)&gt;</code> は、このオブジェクトの表現としてまったく役に立ちません。(<code class=\"docutils literal notranslate\">polls/models.py</code> ファイル内にある) <code class=\"docutils literal notranslate\">Question</code> モデルを編集してこれを修正しましょう。 <a class=\"reference internal\" href=\"/ja/6.1/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> メソッドを <code class=\"docutils literal notranslate\">Question</code> と <code class=\"docutils literal notranslate\">Choice</code> の両方に追加します。</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/models.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><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    <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\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/6.1/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 id=\"tutorial02-import-timezone\">モデルクラスにクラスメソッドを追加してみましょう:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/models.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><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/6.1/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 でのタイムゾーンの取り扱いに不慣れな場合は、<a class=\"reference internal\" href=\"/ja/6.1/topics/i18n/timezones/\"><span class=\"doc\">タイムゾーンサポートドキュメント</span></a> を参照してください。</p>\n<p>これらの変更を保存したら、新しく Python の対話シェルを起動します（もし、プロンプトに「&gt;&gt;&gt;」が表示されていて、まだシェル内にいる場合は、まず <code class=\"docutils literal notranslate\">exit()</code> を入力して終了してください）。その後、再度 <code class=\"docutils literal notranslate\">python manage.py shell</code> を実行して、モデルを再読み込みします。</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=\"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;QuerySet [&lt;Question: What&#39;s up?&gt;]&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;QuerySet [&lt;Question: What&#39;s up?&gt;]&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=\"s2\">&quot;What&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Question: What&#39;s up?&gt;]&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 (defined as &quot;choice_set&quot;) to hold the &quot;other side&quot; of a ForeignKey</span>\n<span class=\"go\"># relation (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\">&lt;QuerySet []&gt;</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=\"s2\">&quot;Not much&quot;</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=\"s2\">&quot;The sky&quot;</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=\"s2\">&quot;Just hacking again&quot;</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;QuerySet [&lt;Choice: Not much&gt;, &lt;Choice: The sky&gt;, &lt;Choice: Just hacking again&gt;]&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;QuerySet [&lt;Choice: Not much&gt;, &lt;Choice: The sky&gt;, &lt;Choice: Just hacking again&gt;]&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=\"s2\">&quot;Just hacking&quot;</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/6.1/ref/models/relations/\"><span class=\"doc\">リレーション先オブジェクトにアクセスする</span></a> を参照してください。 API を通じた、フィールドルックアップのためのダブルアンダースコアの使い方は <a class=\"reference internal\" href=\"/ja/6.1/topics/db/queries/#field-lookups-intro\"><span class=\"std std-ref\">フィールドルックアップ</span></a> を参照してください。データーベース API の詳細は <a class=\"reference internal\" href=\"/ja/6.1/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=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-4-unix-label\">Linux / macOS</p><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</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-4-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py createsuperuser\n</code></pre></div></div></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=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-5-unix-label\">Linux / macOS</p><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</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-5-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py runserver\n</code></pre></div></div></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 のログイン画面\" src=\"/ja/6.1/_images/admin01.png\" />\n<p>デフォルトでは <a class=\"reference internal\" href=\"/ja/6.1/topics/i18n/translation/\"><span class=\"doc\">翻訳</span></a> がオンになっているので、 <a class=\"reference internal\" href=\"/ja/6.1/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_CODE</code></a> を設定すると、与えられた言語でログイン画面が表示されるようになります(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 のインデックスページ\" src=\"/ja/6.1/_images/admin02.png\" />\n<p>いくつかのタイプの編集可能なコンテンツがあるはずです（groups と users）。これらは Django に含まれる認証フレームワーク <a class=\"reference internal\" href=\"/ja/6.1/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>やるべきことは1つです: <code class=\"docutils literal notranslate\">Question</code> オブジェクトがadmin インタフェースを持つということを、adminに伝える必要があります。これを行うために、ファイル  <code class=\"file docutils literal notranslate\">polls/admin.py</code> を開いてこのように編集しましょう:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/admin.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><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>私たちが <code class=\"docutils literal notranslate\">Question</code> を登録したので、 Django は admin インデックスページにこれを表示すべきだということを知っています:</p>\n<img alt=\"Django adminのインデックスページ、現在はpollsが表示されています\" src=\"/ja/6.1/_images/admin03t.png\" />\n<p>&quot;Questions&quot; をクリックしましょう。questions のための &quot;change list&quot; ページが表示されます。このページにはデータベース中のすべての question が表示され、あなたはその中のひとつを選んで変更することができます。ここには私たちが以前作成した &quot;What's UP?&quot; question もあります:</p>\n<img alt=\"投票の変更一覧ページ\" src=\"/ja/6.1/_images/admin04t.png\" />\n<p>「What’s up?」をクリックして編集してみましょう:</p>\n<img alt=\"質問オブジェクトの編集フォーム\" src=\"/ja/6.1/_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/6.1/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/6.1/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 admin サイトでどう表示するか知っています。</p></li>\n<li><p>各 <a class=\"reference internal\" href=\"/ja/6.1/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>もし「Date published」の値があなたが以前 <a class=\"reference internal\" href=\"/ja/6.1/intro/tutorial01/\"><span class=\"doc\">チュートリアルその1</span></a> で作成した questionと一致しないのであれば、それはおそらくあなたが <a class=\"reference internal\" href=\"/ja/6.1/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=\"質問オブジェクトの履歴ページ\" src=\"/ja/6.1/_images/admin06t.png\" />\n<p>モデルの API や admin サイトに慣れてきたら、 <a class=\"reference internal\" href=\"/ja/6.1/intro/tutorial03/\"><span class=\"doc\">チュートリアルその3</span></a> を読んで、 polls アプリにビューをさらに追加する方法を学習しましょう。</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/6.1/intro/"}],"prev":{"docname":"intro/tutorial01","title":"はじめての Django アプリ作成、その 1","url":"/ja/6.1/intro/tutorial01/"},"next":{"docname":"intro/tutorial03","title":"はじめての Django アプリ作成、その 3","url":"/ja/6.1/intro/tutorial03/"},"formats":{"html":"/ja/6.1/intro/tutorial02/","markdown":"/ja/6.1/intro/tutorial02.md","json":"/ja/6.1/intro/tutorial02.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/intro/tutorial02.txt","official":"https://docs.djangoproject.com/ja/6.1/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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}