.. _topics-db-models: ============ モデルの作成 ============ :revision-up-to: 17812 (1.4) .. module:: django.db.models モデルとは、サイトを構成するデータの、唯一絶対的なデータソースを指します。 モデルには、保存したいデータを表すデータフィールドと、データのビヘイビアを 定義します。通常、一つのモデルは一つのデータベーステーブルに対応しています。 モデルの基本として、以下のことを知っておいてください: * 各モデルは Python のクラスで、 :class:`django.db.models.Model` のサブ クラスです。 * モデルの各アトリビュートの値は、データベース上のあるフィールドを表現 します。 * モデルの情報をもとに、 Django はデータベース API を自動生成します。 API の詳細は「 :ref:`topics-db-queries` 」で解説します。 簡単な例 ======== 以下の例では、 ``first_name`` および ``last_name`` というフィールドを持った ``Person`` モデルを定義しています:: from django.db import models class Person(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) ``first_name`` と ``last_name`` はモデルの *フィールド (fields)* です。各 フィールドはクラスのアトリビュートとして定義します。各々のアトリビュートは データベースのカラムに対応します。 上の ``Person`` モデルは、以下のようなデータベーステーブルを生成します: .. code-block:: sql CREATE TABLE myapp_person ( "id" serial NOT NULL PRIMARY KEY, "first_name" varchar(30) NOT NULL, "last_name" varchar(30) NOT NULL ); いくつか、技術的な注意点があります: * テーブルの名前 ``myapp_person`` はモデルのメタデータから自動的に決定 します。テーブル名は変更できます。「 :ref:`table-names` 」を参照して ください。 * ``id`` は自動的に追加されます。この動作も変更できます。 「 :ref:`automatic-primary-key-fields` 」を参照してください。 * 上の例の ``CREATE TABLE`` SQL 文は PostgreSQL の書式で書かれています が、 Django は :ref:`設定ファイル ` に指定しておいた データベースバックエンドに合わせて適切な SQL を発行します。 モデルを使う ============ モデルを定義したら、そのモデルを *使う* よう Django に指示しましょう。設定 ファイルを編集して、 ``models.py`` の入っているパッケージの名前を :setting:`INSTALLED_APPS` 設定に追加してください。 例えば、アプリケーションのモデルが ``mysite.myapp.models`` モジュール (``mysite.myapp`` は :djadmin:`manage.py startapp ` スクリプトで 作成したアプリケーションのパッケージ) に入っているなら、 :setting:`INSTALLED_APPS` に以下のように書きます:: INSTALLED_APPS = ( #... 'mysite.myapp', #... ) 新しいアプリケーションを :setting:`INSTALLED_APPS` に追加したら、 :djadmin:`manage.py syncdb ` を忘れずに実行してください。 フィールド ========== モデルのフィールドは、モデルの定義で最も重要な、かつ最小限必要な要素です。 フィールドは、以下の例のように、クラスのアトリビュートとして定義します:: class Musician(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) instrument = models.CharField(max_length=100) class Album(models.Model): artist = models.ForeignKey(Musician) name = models.CharField(max_length=100) release_date = models.DateField() num_stars = models.IntegerField() フィールドのタイプ ------------------ モデルの各フィールドには、 :class:`~django.db.models.Field` クラスのサブク ラスから、適切なクラスのインスタンスを生成して入れます。Django は、フィール ドのクラスが何であるかという情報を、以下のような判定で使います: * データベースのカラム型 (``INTEGER``, ``VARCHAR`` など) の決定 * Django の管理サイトで使うウィジェット (````, ``