Django お試し2

Modelをでっちあげてみる
python manage.py startapp polls

user@ubuntu:~/django-projects/mysite$ ls polls/
__init__.py  __init__.pyc  admin.py  admin.pyc  models.py  models.pyc  tests.py  views.py
ディレクトリが作られ、ファイルが出来上がる。

models.py を開き編集。

from django.db import models
import datetime
from django.utils import timezone

class Poll(models.Model):
   question = models.CharField(max_length=200)
   pub_date = models.DateTimeField('date published')
  
   def __unicode__(self):
       return self.question
   def was_published_recently(self):
       return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

class Choice(models.Model):
   poll = models.ForeignKey(Poll)
   choice = models.CharField(max_length=200)
   votes = models.IntegerField()
   def __unicode__(self):
       return self.choice
本家のチュートリアルのとおりに作ってみた。
  • Pollが親でChoiceとー対多の関係になってる。指定してるのは Choice 内の models.ForeignKey(Poll) の部分。他の文字列とか日付とかのメンバと同様に、外部キー制約についても、こーやってメンバの型を決めると、Djangoがいい感じに解釈してくれて、自動で関係を作ってくれるモヨウ。なかなか賢い。
  • __unicode__ メソッドは、shellでオブジェクトを表示した時に表示される文字列。Javaで言うとtoStringみたいなもの。Pythonでは通常 __str__ メソッドを同じ目的に使用するらしいけど、Djangoでは__str__が__unicode__をコールし、その結果をUTF-8に変換して出力するらしい。つまり__unicode__を直接呼ぶと、Unicodeで返ってくるということみたい。

DBにModelを反映させる。
syncdbの前に、関連するコマンドをいくつか

python manage.py sql polls
syncdbで実行されるテーブルのDDL文を確認できる

python manage.py validate
エラーが無いかチェックする

python manage.py sqlall polls
python manage.py sqlindexes polls
python manage.py sqlcustom polls
テーブルのDDL文、インデックスのDDL文、追加で実行するユーザー設定のSQL文が表示される
追加実行されるSQL文は、この例だと
polls/sql/poll.sql
polls/sql/choice.sql
に配置しておく(全部小文字だそうです)。確認してないので間違ってたらゴメンなさい。

python manage.py sqlclear polls
テーブルのDROP文が表示される。

python manage.py help
その他、使用可能なコマンドが表示される。

Model と DB の連携を確認してみる
python manage.py shell

シェルが立ち上がるので、ガリガリPythonコードを書いて確認してみる。
from polls.models import Poll, Choice
Poll.objects.all()
p = Poll(question='test', pub_date=0)
from django.utils import timezone
p2 = Poll(question="test2", pub_date=timezone.now())
p.save()
p.pub_date=timezone.now()
p.save()
p2.save
Poll.objects.all()
c = p.choice_set.create(choice="choice", votes=1)
c2 = p2.choice_set.create(choice="choice2", votes=22)
c.save()
c2.save()
Choice.objects.all()
p.choice_set.all()
Choice.objects.filter(poll_id=1)
Choice.objects.filter(poll__pub_date__year="2012")
こんな感じでゴリゴリいじり倒せる。
一番下みたいな書き方もできるのは、なんかすごい気がする。
やらんけどさ。
最終更新:2012年10月26日 20:58
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。