!!!Django 最初のアプリケーション 1 (環境設定〜モデルの作成) [Django][Python][[[次|Django 最初のアプリケーション 2]]] Pythonの概要も分かり易い. {{amazon 477413760X}} *[The Django Book|http://www.djangobook.com/en/1.0/] *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 * ""プロジェクト名に、djangoやtestは避けること *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 ,ファイル,概要 ,__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. ::起動 {{ref_image django_firstapp01.jpg}} !!データベースの設定 *データベースの接続設定に応じて、setting.pyを編集する。 ,設定項目,内容 ,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以降に含まれるため、他にインストール等不要 ""SQLiteを指定した場合準備は不要。データベースファイルは必要になったときに作成される !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 "", line 1, in File "/usr/local/lib/python2.6/site-packages/psycopg2/__init__.py", line 60, in from _psycopg import BINARY, NUMBER, STRING, DATETIME, ROWID ImportError: libpq.so.5: cannot open shared object file: No such file or directory *[[libpq.so が見つからないエラー|PostgreSQL 8.3.5 インストール]] # 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 *上記テーブルが作成された {{ref_image 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のパッケージ ""プロジェクトは設定のコレクションであり、アプリケーションは特定のWebサイト。プロジェクトは複数のアプリケーションを含み、アプリケーションは複数のプロジェクトに属すことができる ::サンプルアプリケーション(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 {{ref_image 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() [] >>> データベース上にデータが作成されている {{ref_image django_firstapp04.jpg}} !__unicode__メソッドの追加 >>> Poll.objects.all() [] *この出力では、このオブジェクトを表現するには役に立っていないので、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() [] !カスタムメソッドの追加 *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.objects.filter(question__startswith='What') [] >>> 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) >>> p.choice_set.create(choice='The sky',votes=0) >>> c = p.choice_set.create(choice='Just hacking again',votes=0) >>> Choice.objects.filter(poll__pub_date__year=2009) [, , ] >>> c = p.choice_set.filter(choice__startswith='Just hacking') >>> c.delete() ""APIは自動的にリレーションシップ(参照整合性制約)をフォローする。アンダースコアの2重続きは、リレーションシップを区別する [[[次|Django 最初のアプリケーション 2]]]