Django のモデル作成

Creating models
次はアプリケーションを作成して、そのアプリケーションで使うモデルを作成する。


まずは polls アプリを作成。

(venv)[paraches@praches.com myHeroku]$ python manage.py startapp polls
(venv)[paraches@praches.com myHeroku]$ ls
Procfile  fitsync  manage.py  polls  requirements.txt  sqlite.database  venv
(venv)[paraches@praches.com myHeroku]$ ls polls/
__init__.py  models.py  tests.py  views.py
(venv)[paraches@praches.com myHeroku]$ 

models.py に Poll と Choice を作成。

(venv)[paraches@praches.com myHeroku]$ cat polls/models.py 
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_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

(venv)[paraches@praches.com myHeroku]$ 

Activating models
settings.py に polls アプリを登録。
settings.py の INSTALLED_APPS はこんな感じになる。

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'polls',
)

models.py から作られるテーブルを確認。

(venv)[paraches@praches.com myHeroku]$ python manage.py sql polls
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_text" varchar(200) NOT NULL,
    "votes" integer NOT NULL
)
;

COMMIT;
(venv)[paraches@praches.com myHeroku]$ 

syncdb してみる。

(venv)[paraches@praches.com myHeroku]$ python manage.py syncdb

問題なし。


ところで、settings.py でデータベース設定を行っていない場合、データベースファイルはどこにできるんだろう?
と、思って見てみたら manage.py と同じ場所にできてた。

(venv)[paraches@praches.com myHeroku]$ ls
Procfile  fitsync  manage.py  polls  requirements.txt  sqlite.database  venv
(venv)[paraches@praches.com myHeroku]$ 

データベースのファイル名は settings.py の最後に付け足した dj_database_url.config に渡した値。
sqlite は postgres や mySQL に比べて自分でユーザ作ったり色々とする必要がないので楽チン。


Playing with the API
shell で遊んでみる。

(venv)[paraches@praches.com myHeroku]$ python manage.py shell
Python 2.7.2 (default, Mar 21 2012, 03:20:49) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from polls.models import Poll, Choice
>>> Poll.objects.all()
[]
>>> from django.utils import timezone
>>> p = Poll(question="What's new?", pub_date=timezone.now())
>>> p.save()
>>> p.id
1
>>> p.question
"What's new?"
>>> p.pub_date
datetime.datetime(2013, 5, 5, 15, 4, 50, 134537, tzinfo=<UTC>)
>>> p.question = "What's up?"
>>> p.save()
>>> Poll.objects.all()
[<Poll: Poll object>]
>>> 

shell で遊ぶ部分はもう少し先があるけど割愛。
というわけで Writing your first Django app, part 1 は終了。