「はじめての Django アプリ作成」チュートリアルをやったメモ その1
はじめての 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(max_length=200) pub_date = 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 polls_poll Creating table polls_choice 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 was_published_today(self): return self.pub_date.date() == datetime.date.today()
was_published_today() を定義した。
確認してみる。
[Python]
>>> p = Poll.objects.get(pk=1)
>>> p.was_published_today()
False