暇人じゃない

「はじめての Django アプリ作成」チュートリアルをやったメモ その1
DjangoPython

はじめての Django アプリ作成、その 1 — Django v1.0 documentation http://djangoproject.jp/doc/ja/1.0/intro/tutorial01.html をやったメモを書いて行きます。 公式と殆ど同じ事を書いている個人的なメモなので、公式のチュートリアルを読む事をオススメします。

インストールからプロジェクトの作成については以下の記事で書いています。

環境: MacOS X 10.6.4 Python 2.6.5 Django 1.2.3

モデルの作成

モデルの定義

[Python] from django.db import models

class Poll(models.Model): question = models.CharField(maxlength=200) pubdate = models.DateTimeField('date published')

class Choice(models.Model): poll = models.ForeignKey(Poll) choice = models.CharField(max_length=200) votes = models.IntegerField()

**ForeignKey** でリレーションを定義している。
Choice が1つの Poll に関連付けられている。

## モデルを有効にする

**settings.py の INSTALLED_APPS に mysite.polls を追加する**

[Python]
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'mysite.polls',
)

Django が polls アプリケーションを知ることが出来るようになった。

sql polls で polls 用のテーブルを作成する SQL 文を表示する。

[Bash] $ python manage.py sql polls

SQLite だとこんな感じ。

[SQL]
BEGIN;CREATE TABLE "polls_poll" (
    "id" integer NOT NULL PRIMARY KEY,
    "question" varchar(200) NOT NULL,
    "pub_date" datetime NOT NULL
)
;
CREATE TABLE "polls_choice" (
    "id" integer NOT NULL PRIMARY KEY,
    "poll_id" integer NOT NULL REFERENCES "polls_poll" ("id"),
    "choice" varchar(200) NOT NULL,
    "votes" integer NOT NULL
)
;COMMIT;

syncdb で、テーブルをデータベースに作成する。

[Bash] $ python manage.py syncdb Creating table pollspoll Creating table pollschoice Installing index for polls.Choice model No fixtures found.

SQLite で確認してみる。

[Bash]
$ sqlite3 sqlite.db
SQLite version 3.6.23.1
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
auth_group                  auth_user_user_permissions
auth_group_permissions      django_content_type
auth_message                django_session
auth_permission             django_site
auth_user                   polls_choice
auth_user_groups            polls_poll
sqlite> .quit

SQLite を終了させるには .quit

API で遊んでみる

対話シェルを起動

[Bash] $ python manage.py shell

[Python]
>>> from mysite.polls.models import Poll, Choice
# Poll は一つもできていない
>>> Poll.objects.all()

新しく Poll を作成する

import datetime p = Poll(question="Hello, world!", pub_date=datetime.datetime.now()) #作成したオブジェクトを DB に保存。明示的に save() を呼ぶ必要がある p.save()

ID を表示する

p.id 1 p.question 'Hello, world!' 値の変更 p.pub_date = datetime.datetime(2010, 12, 24, 0, 0) p.save() Poll.objects.all() [<Poll: Poll object>]

**__unicode__**

[Python]
<Poll: Poll object>

って分かりにくい。

unicode メソッドを作って Poll.objects.all() や Choice.objects.all() が呼び出された時は question カラム や choice カラムの値を返すようにする。

[Python] class Poll(models.Model): def unicode(self): return self.question

class Choice(models.Model): def unicode(self): return self.choice

以下のように表示が変わる。

[Python]
[<Poll: Poll object>]
↓
[<Poll: Hello, world!>]

今日作成された poll か調べるメソッド

[Python] import datetime def waspublishedtoday(self): return self.pub_date.date() == datetime.date.today()

was_published_today() を定義した。
確認してみる。

[Python]
>>> p = Poll.objects.get(pk=1)
>>> p.was_published_today()
False

About

chocoby (GitHub / Twitter)

フリーのソフトウェア開発者です。 Ruby を使った Web 開発を得意としています。