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

MyMemoWiki

Django 最初のアプリケーション 1

提供: MyMemoWiki
ナビゲーションに移動 検索に移動

Django 最初のアプリケーション 1 (環境設定~モデルの作成)

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

Pythonの概要も分かり易い.

を参考にサンプルアプリケーションを作成してみる

Djangoがインストールされている

import django がpythonインタプリタから行えること
  1. # python
  2. Python 2.6.2 (r262:71600, Jun 13 2009, 02:28:29)
  3. [GCC 4.1.2 20070626 (Red Hat 4.1.2-13)] on linux2
  4. Type "help", "copyright", "credits" or "license" for more information.
  5. >>> import django
Helpを確認
  1. >>> help(django)
  2. Help on package django:
  3.  
  4. NAME
  5. django
  6.  
  7. FILE
  8. /usr/local/lib/python2.6/site-packages/django/__init__.py
  9.  
  10. PACKAGE CONTENTS
  11. bin (package)
  12. conf (package)
  13. contrib (package)
  14. :

プロジェクトの作成

django-admin.py コマンドの実行

  • Djangoを最初に利用する場合、初期化処理を行う必要がある
  • コードを置こうと思っているディレクトリで、以下のコマンドを実行(mysiteディレクトリが作成される)
  1. # django-admin.py startproject mysite

<blockquote>プロジェクト名に、djangoやtestは避けること</blockquote>

  • django-admin.py は、Django を setpu.py でインストールしたシステムパス(/usr/local/binのような)にある。
  1. # whereis django-admin.py
  2. django-admin: /usr/local/bin/django-admin.py

作成されるファイル

  • startprojectは以下のファイルを作成
  1. # tree
  2. .
  3. `-- mysite
  4. |-- __init__.py
  5. |-- manage.py
  6. |-- settings.py
  7. `-- urls.py
ファイル 概要
__init__.py このディレクトリがパッケージだとPythonに伝える空のファイル
manage.py プロジェクトと対話するためのコマンドラインユーティリティ
settings.py プロジェクトの設定ファイル
urls.py プロジェクトのURL宣言

開発サーバー

  • mysiteディレクトリへ入って、以下を実行
  1. # python manage.py runserver
  2. Validating models...
  3. 0 errors found
  4.  
  5. Django version 1.0.2 final, using settings 'mysite.settings'
  6. Development server is running at http://127.0.0.1:8000/
  7. Quit the server with CONTROL-C.

起動ポート、IPアドレスを変更する

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

0350 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以降に含まれるため、他にインストール等不要

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

PostgreSQLを利用してみる

  1. DATABASE_ENGINE = 'postgresql_psycopg2'
  2. DATABASE_NAME = 'testdb'
  3. DATABASE_USER = 'postgres'
  4. DATABASE_PASSWORD = '******'
  5. DATABASE_HOST =
  6. 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

  • 次のステップで、以下を行うとエラー
  1. # python manage.py syncdb
  2. raise ImproperlyConfigured("Error loading psycopg2 module: %s" % e)

django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 module: No module named psycopg2

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

OK


syncdbの実行

PostgreSQLを起動しておく
  1. #pg_ctl start
syncdbコマンドの実行
  1. # python manage.py syncdb
  2. Creating table auth_permission
  3. Creating table auth_group
  4. Creating table auth_user
  5. Creating table auth_message
  6. Creating table django_content_type
  7. Creating table django_session
  8. Creating table django_site
  9.  
  10. You just installed Django's auth system, which means you don't have any superusers defined.
  11. Would you like to create one now? (yes/no): yes
  12. Username (Leave blank to use 'root'):
  13. Error: That e-mail address is invalid.
  14. E-mail address: piroto@typea.info
  15. Password:
  16. Password (again):
  17. Superuser created successfully.
  18. Installing index for auth.Permission model
  19. Installing index for auth.Message model
  • 上記テーブルが作成された

0351 django firstapp02.jpg

INSTALLED_APPS設定
  • INSTALLED_APPS変数は、このDjangoインスタンスからアクティベートされるすべてのDjangoアプリケーションで保持される
  1. INSTALLED_APPS = (
  2. 'django.contrib.auth',
  3. 'django.contrib.contenttypes',
  4. 'django.contrib.sessions',
  5. 'django.contrib.sites',
  6. )

モデルの生成

アプリケーションの作成

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

<blockquote>プロジェクトは設定のコレクションであり、アプリケーションは特定のWebサイト。プロジェクトは複数のアプリケーションを含み、アプリケーションは複数のプロジェクトに属すことができる</blockquote>

サンプルアプリケーション(polls)の作成
  1. # python manage.py startapp polls
作成されるファイル
  1. # tree ./polls
  2. ./polls
  3. |-- __init__.py
  4. |-- models.py
  5. `-- views.py

モデルの作成

  • Django Web アプリケーションでは、モデルを定義する
  • 単純なサンプルアプリケーション(poll)では、2つのモデル polls、choicesを作成する
  • pollは、質問と発表日、choiceは選択テキストと同意への投票の2つのフィールドを持つ
  • /polls/models.pyに記述
  1. from django.db import models
  2.  
  3. class Poll(models.Model):
  4. question = models.CharField(max_length=200)
  5. pub_date = models.DateField('date published')
  6.  
  7. class Choice(models.Model):
  8. poll = models.ForeignKey(Poll)
  9. choice = models.CharField(max_length=200)
  10. votes = models.IntegerField()

モデルの開始

settings.pyを以下のように編集

  1. INSTALLED_APPS = (
  2. 'django.contrib.auth',
  3. 'django.contrib.contenttypes',
  4. 'django.contrib.sessions',
  5. 'django.contrib.sites',
  6. 'mysite.polls'
  7. )

DDLの確認~テーブルの生成

DDLを発行し、テープルを作成する
  1. # python manage.py sql polls
  2. BEGIN;
  3. CREATE TABLE "polls_poll" (
  4. "id" serial NOT NULL PRIMARY KEY,
  5. "question" varchar(200) NOT NULL,
  6. "pub_date" date NOT NULL
  7. )
  8. ;
  9. CREATE TABLE "polls_choice" (
  10. "id" serial NOT NULL PRIMARY KEY,
  11. "poll_id" integer NOT NULL REFERENCES "polls_poll" ("id") DEFERRABLE INITIALLY DEFERRED,
  12. "choice" varchar(200) NOT NULL,
  13. "votes" integer NOT NULL
  14. )
  15. ;
  16. COMMIT;
テーブルの生成
  1. # python manage.py syncdb
  2. Creating table polls_poll
  3. Creating table polls_choice
  4. Installing index for polls.Choice model

0352 django firstapp03.jpg

APIから操作してみる

  • manage.pyを指定することで、プロジェクト環境が設定される
    • mysiteをsys.pathに設定
    • DJANGO_SETTINGS_MODULE 環境変数の設定
  1. # python manage.py shell
Shellからdatabase APIを利用
  1. >>> from mysite.polls.models import Poll,Choice #モデルとクラスのインポート
  2. #まだpollsは存在していない
  3. >>> Poll.objects.all()
  4. []
  5. #pollを生成
  6. >>> import datetime
  7. >>> p = Poll(question="What's up?",pub_date=datetime.datetime.now())
  8. >>> p.save()
  9. >>> p.id
  10. 1L
  11. #Pythonの属性を経由してデータベースのカラムにアクセス
  12. >>> p.question
  13. "What's up?"
  14. >>> p.pub_date
  15. datetime.datetime(2009, 6, 16, 8, 54, 31, 757771)
  16. >>> p.save()
  17. #データベース上のpollを表示
  18. >>> Poll.objects.all()
  19. [<Poll: Poll object>]
  20. >>>

データベース上にデータが作成されている 0353 django firstapp04.jpg

__unicode__メソッドの追加

  1. >>> Poll.objects.all()
  2. [<Poll: Poll object>]
  • この出力では、このオブジェクトを表現するには役に立っていないので、polls/models.py のクラスに__unicode__メソッドを追加する
  1. class Poll(models.Model):
  2. :
  3. def __unicode__(self):
  4. return self.question
  5. class Choice(models.Model):
  6. :
  7. def __unicode__(self):
  8. return self.choice
  • 出力がこうなる
  1. >>> Poll.objects.all()
  2. [<Poll: What's up?>]

カスタムメソッドの追加

  • python通常のメソッドを追加して、簡単なデモ
  1. import datetime
  2. class Poll(models.Model):
  3. :
  4. def was_published_today(self):
  5. return self.pub_date == datetime.date.today()
  1. >>> from mysite.polls.models import Poll,Choice
  2.  
  3. #Djangoは高機能なlookup APIを提供
  4. >>> Poll.objects.filter(id=1)
  5. [<Poll: What's up?>]
  6. >>> Poll.objects.filter(question__startswith='What')
  7. [<Poll: What's up?>]
  8. >>> p = Poll.objects.get(id=1)
  9.  
  10. #カスタムメソッドが動作することを確認
  11. >>> p.was_published_today()
  12. True
  13.  
  14. #INSERTステートメントの記述なしに、createの呼び出しでChoiceオブジェクトを生成する
  15. #外部キー制約を指定したのでchoice_set が有効
  16. >>> p.choice_set.create(choice='Not much',votes=0)
  17. <Choice: Not much>
  18. >>> p.choice_set.create(choice='The sky',votes=0)
  19. <Choice: The sky>
  20. >>> c = p.choice_set.create(choice='Just hacking again',votes=0)
  21. >>> Choice.objects.filter(poll__pub_date__year=2009)
  22. [<Choice: Just hacking again>, <Choice: The sky>, <Choice: Not much>]
  23. >>> c = p.choice_set.filter(choice__startswith='Just hacking')
  24. >>> c.delete()

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

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