| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
ページの作成:「==Django 最初のアプリケーション 1 (環境設定~モデルの作成)== [Django 最初のアプリケーション 2]] Django][Python][[[次] Pythonの概…」
==Django 最初のアプリケーション 1 (環境設定~モデルの作成)==
[Django 最初のアプリケーション 2]] Django][Python][[[次]

Pythonの概要も分かり易い.
{{amazon|477413760X}}

*[http://www.djangobook.com/en/1.0/ The Django Book]

*http://docs.djangoproject.com/en/dev/intro/tutorial01/#intro-tutorial01
を参考にサンプルアプリケーションを作成してみる

===Djangoがインストールされている===
*Django インストール
=====import django がpythonインタプリタから行えること=====
# python
Python 2.6.2 (r262:71600, Jun 13 2009, 02:28:29)
[GCC 4.1.2 20070626 (Red Hat 4.1.2-13)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
=====Helpを確認=====
>>> help(django)
Help on package django:

NAME
django

FILE
/usr/local/lib/python2.6/site-packages/django/__init__.py

PACKAGE CONTENTS
bin (package)
conf (package)
contrib (package)
:
===プロジェクトの作成===
====django-admin.py コマンドの実行====
*Djangoを最初に利用する場合、初期化処理を行う必要がある
*コードを置こうと思っているディレクトリで、以下のコマンドを実行(mysiteディレクトリが作成される)
# django-admin.py startproject mysite

*
<blockquote>プロジェクト名に、djangoやtestは避けること</blockquote>
*django-admin.py は、Django を setpu.py でインストールしたシステムパス(/usr/local/binのような)にある。
# whereis django-admin.py
django-admin: /usr/local/bin/django-admin.py

====作成されるファイル====
*startprojectは以下のファイルを作成
# tree
.
`-- mysite
|-- __init__.py
|-- manage.py
|-- settings.py
`-- urls.py
{|class="wikitable"
!ファイル
!概要
|-
|__init__.py
|このディレクトリがパッケージだとPythonに伝える空のファイル
|-
|manage.py
|プロジェクトと対話するためのコマンドラインユーティリティ
|-
|settings.py
|プロジェクトの設定ファイル
|-
|urls.py
|プロジェクトのURL宣言
|-
|}

===開発サーバー===
*mysiteディレクトリへ入って、以下を実行
# python manage.py runserver
Validating models...
0 errors found

Django version 1.0.2 final, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
*開発サーバーを起動すると、Pythonで書かれた軽量サーバーが http://127.0.0.1:8000/ で起動する
====起動ポート、IPアドレスを変更する====
*デフォルトで開発サーバーはポート8000で起動するが、ポートを指定して起動することもできる。
# python manage.py runserver 8080
*IPアドレスはローカルホストしかリッスンしていないようだが、指定することができる
# python manage.py runserver 192.168.24.14:8080
Validating models...
0 errors found

Django version 1.0.2 final, using settings 'mysite.settings'
Development server is running at http://192.168.24.14:8080/
Quit the server with CONTROL-C.
=====起動=====
[[File:0350_django_firstapp01.jpg]]

===データベースの設定===
*データベースの接続設定に応じて、setting.pyを編集する。
{|class="wikitable"
!設定項目
!内容
|-
|DATABASE_ENGINE
|'postgresql_psycopg2'、'mysql'、'sqlite3'その他
|-
|DATABASE_NAME
|データベース名。SQLiteの場合、絶対パス名存在しない場合、初回自動的に作成される。
|-
|DATABASE_USER
| データベースユーザー名。SQLiteの場合不要
|-
|DATABASE_PASSWORD
|データベースパスワード。SQLiteの場合不要
|-
|DATABASE_HOST
|データーベースのホスト。設定しない場合、物理的に同じマシンとみなされる。SQLiteでは不要
|-
|}

====SQLiteは、Pytho2.5以降に含まれる====
*SQLiteを使用する場合、DATABASE_ENGINEに sqlite3を指定する
*Python2.5以降に含まれるため、他にインストール等不要

<blockquote>SQLiteを指定した場合準備は不要。データベースファイルは必要になったときに作成される</blockquote>

====PostgreSQLを利用してみる====
*PostgreSQL 8.3.5 インストール
*PostgresSQL 8.3.5 起動と停止
*PostgreSQL pgAdminのインストール

DATABASE_ENGINE = 'postgresql_psycopg2'
DATABASE_NAME = 'testdb'
DATABASE_USER = 'postgres'
DATABASE_PASSWORD = '******'
DATABASE_HOST = ''
DATABASE_PORT = '5432'

====psycopg Python-PostgreSQL Database Adapterのインストール====
http://www.initd.org/pub/software/psycopg/
http://www.initd.org/pub/software/psycopg/psycopg2-2.0.11.tar.gz

*次のステップで、以下を行うとエラー
# python manage.py syncdb

raise ImproperlyConfigured("Error loading psycopg2 module: %s" % e)
django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 module: No module named psycopg2

=====psycopg のインストール=====
# wget http://www.initd.org/pub/software/psycopg/psycopg2-2.0.11.tar.gz
# tar zxvf psycopg2-2.0.11.tar.gz
*解凍してできたディレクトリで、以下を実行
# python setup.py install
*インポートできるか?
#python
>>> import psycopg2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.6/site-packages/psycopg2/__init__.py", line 60, in <module>
from _psycopg import BINARY, NUMBER, STRING, DATETIME, ROWID
ImportError: libpq.so.5: cannot open shared object file: No such file or directory
*[PostgreSQL 8.3.5 インストール] [libpq.so が見つからないエラー]
# LD_LIBRARY_PATH=/usr/local/pgsql/lib:$LD_LIBRARY_PATH

OK


====syncdbの実行====
=====PostgreSQLを起動しておく=====
#pg_ctl start
=====syncdbコマンドの実行=====
# python manage.py syncdb
Creating table auth_permission
Creating table auth_group
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
Creating table django_site

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (Leave blank to use 'root'):
Error: That e-mail address is invalid.
E-mail address: piroto@typea.info
Password:
Password (again):
Superuser created successfully.
Installing index for auth.Permission model
Installing index for auth.Message model
*上記テーブルが作成された
[[File:0351_django_firstapp02.jpg]]
=====INSTALLED_APPS設定=====
*INSTALLED_APPS変数は、このDjangoインスタンスからアクティベートされるすべてのDjangoアプリケーションで保持される
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
)

===モデルの生成===
====アプリケーションの作成====
*ここまでで、プロジェクト環境は作成された
*Djangoのアプリケーションは、Pythonのパッケージ

<blockquote>プロジェクトは設定のコレクションであり、アプリケーションは特定のWebサイト。プロジェクトは複数のアプリケーションを含み、アプリケーションは複数のプロジェクトに属すことができる</blockquote>
=====サンプルアプリケーション(polls)の作成=====
# python manage.py startapp polls
=====作成されるファイル=====
# tree ./polls
./polls
|-- __init__.py
|-- models.py
`-- views.py

====モデルの作成====
*Django Web アプリケーションでは、モデルを定義する
*単純なサンプルアプリケーション(poll)では、2つのモデル polls、choicesを作成する
*pollは、質問と発表日、choiceは選択テキストと同意への投票の2つのフィールドを持つ
*/polls/models.pyに記述

from django.db import models

class Poll(models.Model):
question = models.CharField(max_length=200)
pub_date = models.DateField('date published')

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

====モデルの開始====

====settings.pyを以下のように編集====
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'mysite.polls'
)

====DDLの確認~テーブルの生成====
*Djangoは、pollsを含むmysiteを認識しているので、以下のコマンドを実行
*[PostgresSQL 8.3.5 起動と停止] [データベースを起動しておく]
=====DDLを発行し、テープルを作成する=====
# python manage.py sql polls
BEGIN;
CREATE TABLE "polls_poll" (
"id" serial NOT NULL PRIMARY KEY,
"question" varchar(200) NOT NULL,
"pub_date" date NOT NULL
)
;
CREATE TABLE "polls_choice" (
"id" serial NOT NULL PRIMARY KEY,
"poll_id" integer NOT NULL REFERENCES "polls_poll" ("id") DEFERRABLE INITIALLY DEFERRED,
"choice" varchar(200) NOT NULL,
"votes" integer NOT NULL
)
;
COMMIT;
=====テーブルの生成=====
# python manage.py syncdb
Creating table polls_poll
Creating table polls_choice
Installing index for polls.Choice model
[[File:0352_django_firstapp03.jpg]]

===APIから操作してみる===
*manage.pyを指定することで、プロジェクト環境が設定される
**mysiteをsys.pathに設定
**DJANGO_SETTINGS_MODULE 環境変数の設定
# python manage.py shell
=====Shellからdatabase APIを利用=====

>>> from mysite.polls.models import Poll,Choice #モデルとクラスのインポート
#まだpollsは存在していない
>>> Poll.objects.all()
[]
#pollを生成
>>> import datetime
>>> p = Poll(question="What's up?",pub_date=datetime.datetime.now())
>>> p.save()
>>> p.id
1L
#Pythonの属性を経由してデータベースのカラムにアクセス
>>> p.question
"What's up?"
>>> p.pub_date
datetime.datetime(2009, 6, 16, 8, 54, 31, 757771)
>>> p.save()
#データベース上のpollを表示
>>> Poll.objects.all()
[<Poll: Poll object>]
>>>
データベース上にデータが作成されている
[[File:0353_django_firstapp04.jpg]]
====__unicode__メソッドの追加====

>>> Poll.objects.all()
[<Poll: Poll object>]
*この出力では、このオブジェクトを表現するには役に立っていないので、polls/models.py のクラスに__unicode__メソッドを追加する

class Poll(models.Model):
:
def __unicode__(self):
return self.question
class Choice(models.Model):
:
def __unicode__(self):
return self.choice

*出力がこうなる
>>> Poll.objects.all()
[<Poll: What's up?>]

====カスタムメソッドの追加====
*python通常のメソッドを追加して、簡単なデモ
import datetime
class Poll(models.Model):
:
def was_published_today(self):
return self.pub_date == datetime.date.today()

>>> from mysite.polls.models import Poll,Choice

#Djangoは高機能なlookup APIを提供
>>> Poll.objects.filter(id=1)
[<Poll: What's up?>]
>>> Poll.objects.filter(question__startswith='What')
[<Poll: What's up?>]
>>> p = Poll.objects.get(id=1)

#カスタムメソッドが動作することを確認
>>> p.was_published_today()
True

#INSERTステートメントの記述なしに、createの呼び出しでChoiceオブジェクトを生成する
#外部キー制約を指定したのでchoice_set が有効
>>> p.choice_set.create(choice='Not much',votes=0)
<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)
>>> Choice.objects.filter(poll__pub_date__year=2009)
[<Choice: Just hacking again>, <Choice: The sky>, <Choice: Not much>]
>>> c = p.choice_set.filter(choice__startswith='Just hacking')
>>> c.delete()

<blockquote>APIは自動的にリレーションシップ(参照整合性制約)をフォローする。アンダースコアの2重続きは、リレーションシップを区別する</blockquote>

[Django 最初のアプリケーション 2]] [[次]

案内メニュー