django学習(2)---最初のアプリケーション(app)の第1部を書く
37536 ワード
原文http://docs.djangoproject.com/en/1.2/intro/tutorial01/#intro-tutorial01
1.django-admin.py startprojectを使用してプロジェクトを作成する
django-admin.py startproject mysite.現在のディレクトリの下にmysiteディレクトリが作成されました
mysiteディレクトリには次の4つのファイルが含まれています.
1>__init__.py:現在のディレクトリがパッケージであることを示す空のファイルです.
2>manage.py:Django projectと様々な方法で対話できるコマンドラインユーティリティです.後で詳しく説明します
3>settings.py:djangoプロジェクトを設定します.設定内容には、データベース接続、プロジェクトに含まれるappなどが含まれます.
4>urls.py.djangoプロジェクトのurl宣言.
2.manag.py runserver ip port
manage.py runserver 80#django serverを起動すると、次のインタフェースが表示されます.
アドレスバーに入力:http://127.0.0.1を選択すると、次の結果が構成に成功したことを示します.
3.データベースの構成
settings.pyを開き、DATABASESの変更は次のようになります.
DATABASES = {
'default': {
'ENGINE':'django.db.backends.mysql',#4.ここではMySQLデータベースを使用します..
'NAME': 'django', #SQLite 3を使用する場合のデータベース名のパスを示します.
'USER': 'root', # データベースに接続するユーザー名はSQLite 3では使用できません.
'PASSWORD': '123456', # データベースに接続するパスワードはSQLite 3では使いません.
'HOST': '', # データベースが存在するサーバです.ここではprojectと同じディレクトリにあります.指定しなくてもいいです.
'PORT': '', # データベースのポート番号
}
}
次にmanage.py syncdb.上の例のデータベースを最初に作成する必要があります.
作成したappをmanage.py syncdbコマンドでデータベースに同期できます.
4.manage.py startappnameでappを作成する.
manage.py startapp polls#は、現在のディレクトリの下にpollsディレクトリを作成します.pollsディレクトリの下にも4つのファイルが含まれています.
__init__.py,models.py,tests.py,views.py
polls/models.pyを編集し、次のようにします.
settings.pyのINSTALLED_APPS部分を修正し、以下のようになります.
manage.py validateを実行してエラーがないかどうかを確認します.「0 errors found」が発生した場合、問題はありません.
manage.py sql polls.では、データベースに同期したときに実行するsql文を表示できます.次の図はsql文です.
説明:1>ここのsql文は、使用するデータベースによって異なる場合があります.sql文は異なります.
2>テーブル名の決定.テーブル名はappname_lower(model)で構成されています.例のappnameはpolls、modelはpollとchoiceなのでテーブル名
polls_choice,polls_poll.
3>sqlコマンドは、データベースで実際に実行されていません.djangoが実行するsql文を出力するだけです.
4>上記のsql文では、djangoが各テーブルに逐次フィールドidを自動的に追加することを示した.
5>外部キーには、polls_choiceテーブルのpoll_idフィールドなどのmodelname_idが使用されます.
また、ここで関連するコマンドには、manage.py sqlcustomappname、manage.py sqlclear appname(データベース内のテーブルの存在に応じてdrop tableを出力するために必要な文)、manage.py sqlindexes appname(appのインデックス作成を出力するsql文)、manage.py sqlall appname(sql、sqlcustoms、sqlindexesの組合せ)があります.
manage.py syncdbデータベースへの同期
5.APIでいくつかの試みをする
manage.pyの実行 shell.ここはpython shellではありません.まずmanage.py shellの設定を見てみましょう.
コード#コード#
manage.py shellは2つの仕事をしました.
1>sys.pathにmysiteを追加
2>環境変数DJANGO_SETTINGS_MODULEが設定され、環境変数がsettingsを示す のパス
コード#コード#
下を見るとここがちょっと変で、
修正してpolls/models.pyを編集し、次のように変更します.
コード#コード#
効果を見る:
次にPollにカスタムメソッドを追加します.was_published_today.
コード#コード#
manage.py shellを再実行
コード#コード#
次に関係を見てみましょう
コード#コード#
1.django-admin.py startprojectを使用してプロジェクトを作成する
django-admin.py startproject mysite.現在のディレクトリの下にmysiteディレクトリが作成されました
mysiteディレクトリには次の4つのファイルが含まれています.
1>__init__.py:現在のディレクトリがパッケージであることを示す空のファイルです.
2>manage.py:Django projectと様々な方法で対話できるコマンドラインユーティリティです.後で詳しく説明します
3>settings.py:djangoプロジェクトを設定します.設定内容には、データベース接続、プロジェクトに含まれるappなどが含まれます.
4>urls.py.djangoプロジェクトのurl宣言.
2.manag.py runserver ip port
manage.py runserver 80#django serverを起動すると、次のインタフェースが表示されます.
アドレスバーに入力:http://127.0.0.1を選択すると、次の結果が構成に成功したことを示します.
3.データベースの構成
settings.pyを開き、DATABASESの変更は次のようになります.
DATABASES = {
'default': {
'ENGINE':'django.db.backends.mysql',#4.ここではMySQLデータベースを使用します..
'NAME': 'django', #SQLite 3を使用する場合のデータベース名のパスを示します.
'USER': 'root', # データベースに接続するユーザー名はSQLite 3では使用できません.
'PASSWORD': '123456', # データベースに接続するパスワードはSQLite 3では使いません.
'HOST': '', # データベースが存在するサーバです.ここではprojectと同じディレクトリにあります.指定しなくてもいいです.
'PORT': '', # データベースのポート番号
}
}
次にmanage.py syncdb.上の例のデータベースを最初に作成する必要があります.
作成したappをmanage.py syncdbコマンドでデータベースに同期できます.
4.manage.py startappnameでappを作成する.
manage.py startapp polls#は、現在のディレクトリの下にpollsディレクトリを作成します.pollsディレクトリの下にも4つのファイルが含まれています.
__init__.py,models.py,tests.py,views.py
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=models.CharField(max_length=200)
votes=models.IntegerField()
settings.pyのINSTALLED_APPS部分を修正し、以下のようになります.
INSTALLED_APPS
=
(
'
django.contrib.auth
'
,
'
django.contrib.contenttypes
'
,
'
django.contrib.sessions
'
,
'
django.contrib.sites
'
,
'
django.contrib.messages
'
,
'
mysite.polls
'
,
)
manage.py validateを実行してエラーがないかどうかを確認します.「0 errors found」が発生した場合、問題はありません.
manage.py sql polls.では、データベースに同期したときに実行するsql文を表示できます.次の図はsql文です.
説明:1>ここのsql文は、使用するデータベースによって異なる場合があります.sql文は異なります.
2>テーブル名の決定.テーブル名はappname_lower(model)で構成されています.例のappnameはpolls、modelはpollとchoiceなのでテーブル名
polls_choice,polls_poll.
3>sqlコマンドは、データベースで実際に実行されていません.djangoが実行するsql文を出力するだけです.
4>上記のsql文では、djangoが各テーブルに逐次フィールドidを自動的に追加することを示した.
5>外部キーには、polls_choiceテーブルのpoll_idフィールドなどのmodelname_idが使用されます.
また、ここで関連するコマンドには、manage.py sqlcustomappname、manage.py sqlclear appname(データベース内のテーブルの存在に応じてdrop tableを出力するために必要な文)、manage.py sqlindexes appname(appのインデックス作成を出力するsql文)、manage.py sqlall appname(sql、sqlcustoms、sqlindexesの組合せ)があります.
manage.py syncdbデータベースへの同期
5.APIでいくつかの試みをする
manage.pyの実行 shell.ここはpython shellではありません.まずmanage.py shellの設定を見てみましょう.
コード#コード#
>>>
import
sys
>>>
sys.path
[
'
D:\\mysite
'
,
'
C:\\Python25\\lib\\site-packages\\babel-0.9.5-py2.5.egg
'
,
'
C:\\P
ython25\\lib\\site
-
packages\\trac
-
0.11
.
7
.1dev
-
py2.
5
.egg
'
, 。。。。]
>>>
import
os
>>>
os.environ[
"
DJANGO_SETTINGS_MODULE
"
]
'
mysite.settings
'
manage.py shellは2つの仕事をしました.
1>sys.pathにmysiteを追加
2>環境変数DJANGO_SETTINGS_MODULEが設定され、環境変数がsettingsを示す のパス
コード#コード#
>>> from mysite.polls.models import Poll,Choice
>>> # no polls are in the system yet
>>> Poll.objects.all()
>>> import datetime
>>> p=Poll(question="What's up?",pub_date=datetime.datetime.now())
>>> p.save()# , save()
>>> p.id
1L
>>> p.question #
"What's up?"
>>> p.pub_date #
datetime.datetime(2010, 8, 10, 10, 44, 56, 593000)
>>> p.pub_date=datetime.datetime(2010,8,10,0,0)
>>> p.save()
>>> p.pub_date
datetime.datetime(2010, 8, 10, 0, 0)
>>> Poll.objects.all()
[<Poll: Poll object>]
下を見るとここがちょっと変で、
>>>
Poll.objects.all()
[
<
Poll: Poll object
>
]
修正してpolls/models.pyを編集し、次のように変更します.
コード#コード#
#
coding:cp936
from
django.db
import
models
class
Poll(models.Model):
question
=
models.CharField(max_length
=
200
)
pub_date
=
models.DateTimeField(
"
date published
"
)
# __unicode__(self)
def
__unicode__
(self):
return
self.question
class
Choice(models.Model):
poll
=
models.ForeignKey(Poll)
choice
=
models.CharField(max_length
=
200
)
votes
=
models.IntegerField()
# __unicode__(self)
def
__unicode__
(self):
return
self.choice
効果を見る:
>>>
from
mysite.polls.models
import
Poll
>>>
Poll.objects.all()
[
<
Poll: What
'
s up?>]
次にPollにカスタムメソッドを追加します.was_published_today.
コード#コード#
from
django.db
import
models
import
datetime
class
Poll(models.Model):
question
=
models.CharField(max_length
=
200
)
pub_date
=
models.DateTimeField(
"
date published
"
)
def
__unicode__
(self):
return
self.question
#
was_published_today
def
was_published_today(self):
return
self.pub_date.date()
==
datetime.datetime.today()
manage.py shellを再実行
コード#コード#
>>>
from
mysite.polls.models
import
Poll,Choice
>>>
Poll.objects.all()
#
[
<
Poll: What
'
s up?>]
>>>
Poll.objects.filter(id
=
1
)
#
,
[
<
Poll: What
'
s up?>]
>>>
Poll.objects.filter(question__startswith
=
"
What
"
)
#
,
[
<
Poll: What
'
s up?>]
>>>
Poll.objects.get(pub_date__year
=
2010
)
#
,
<
Poll: What
'
s up?>
>>>
Poll.ojbects.get(id
=
2
)
#
, id =2 Poll
Traceback (most recent call last):
File
"
<console>
"
, line
1
,
in
<
module
>
AttributeError: type object
'
Poll
'
has no attribute
'
ojbects
'
>>>
Poll.objects.get(id
=
2
)
Traceback (most recent call last):
File
"
<console>
"
, line
1
,
in
<
module
>
File
"
C:\Python25\Lib\site-packages\django\db\models\manager.py
"
, line
132
,
in
get
return
self.get_query_set().get(
*
args,
**
kwargs)
File
"
C:\Python25\Lib\site-packages\django\db\models\query.py
"
, line
341
,
in
g
et
%
self.model._meta.object_name)
DoesNotExist: Poll matching query does
not
exist.
>>>
Poll.objects.get(pk
=
1
)
<
Poll: What
'
s up?>
>>>
p
=
Poll.objects.get(pk
=
1
)
>>>
p.was_published_today()
#
was_published_today
False
次に関係を見てみましょう
コード#コード#
>>>
p.choice_set.all()
#
p choice
[]
>>>
p.choice_set.create(choice
=
"
Not much
"
,votes
=
0)
#
choice
<
Choice: Not much
>
>>>
p.choice_set.create(choice
=
"
The sky
"
,votes
=
0)
<
Choice: The sky
>
>>>
c
=
p.choice_set.create(choice
=
"
Just hacking again
"
,votes
=
0)
>>>
c.poll
<
Poll: What
'
s up?>
>>>
p.choice_set.all()
[
<
Choice: Not much
>
,
<
Choice: The sky
>
,
<
Choice: Just hacking again
>
]
>>>
p.choice_set.count()
#
p choice
3
>>>
type(p.choice_set)
<
class
'
django.db.models.fields.related.RelatedManager
'
>
>>>
Choice.objects.filter(poll__pub_date__year
=
2010
)
[
<
Choice: Not much
>
,
<
Choice: The sky
>
,
<
Choice: Just hacking again
>
]
>>>
c
=
p.choice_set.filter(choice__startswith
=
"
Just hacking
"
)
>>>
c
[
<
Choice: Just hacking again
>
]
>>>
c.delete()
#