似非プログラマのうんちく

「似非プログラマの覚え書き」出張版

巳年じゃないけど Python やろうぜ(その 9)

Model を扱う

いよいよ今回から Model を扱います。

…の前に。

AtomDjango アプリの開発を快適に行うために

すっかり忘れていましたが、AtomDjango アプリの開発を行う際に入れておくと良いパッケージを二つ紹介しておきます。

新しいアプリの作成

端末からコマンドを入力して新しいアプリを作成します。

$ ./manage.py startapp customer_search

今回はデータベース内のレコードを ID を入力して顧客を検索する customer_search アプリを作ります。なお今回から Linux 上で作業していますが、基本となる手順はほぼ同じ*1です。

settings.py の編集を忘れずに。

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'hello',
    'customer_search',  # 追加
]

Model を作成する

Model の作成は、Model に対応する class を models.py に書くだけです。と言っても、Rails みたいにコマンド一つで自動生成、とは行かないのが難点ですが…。

from django.db import models

# Create your models here.


class Customer(models.Model):
    name = models.CharField(max_length=20)
    phone = models.CharField(max_length=20)

今回は Customer (顧客)という単一のモデルを扱うことにします。モデル同士の関連性についてはまた後程ということで。

CharFieldVARCHAR 型に対応するもので、max_lengthバイト数を指定できます。このコードは SQLVARCHAR(20) という型宣言と同等になります。なお、主キーは特に指定しなければデフォルトで id というフィールドが勝手に作成されます。

Model を有効にする

作った Model を有効にするための作業が必要です。まずは

$ ./manage.py makemigrations customer_search
Migrations for 'customer_search':
  search/migrations/0001_initial.py:
    - Create model Customer

sqlmigrate コマンドを使うと、migrate コマンドを実行した時に実際に発行される SQL が読めます*2

$ ./manage.py sqlmigrate search 0001
BEGIN;
--
-- Create model Customer
--
CREATE TABLE "customer_search_customer" (
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "name" varchar(20) NOT NULL,
    "phone" varchar(20) NOT NULL
);
COMMIT;

customer_search_customer という新たなテーブルが作成されるようですね。では migrate を実行しましょう。

$ ./manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, customer_search, sessions
Running migrations:
  Applying customer_search.0001_initial... OK

システムに必要なテーブルは既に作成されているので、今回は新しく追加したものだけが実行されました。

次回は公式のチュートリアルに沿って、これを使ってコマンドラインで少し遊んでみます。

*1:Windows 上での作業について特段の補足が必要な場合のみ別途補足します。

*2:下記の出力例は読みやすさのためにフォーマットを変えています。