Pages

Tuesday, December 4, 2012

Django:実践チュートリアル2(アプリケーション作成とモデルの作成)

では、名前、Emailアドレス、写真などを記録できる部分を作りたいと思います。
Djangoでは、プロジェクト、そして、アプリケーションという、概念があります。
ここでは、深くは触れません、習うより慣れろですね。

とりあえず、personsというアプリケーションを作りましょう。
/programmingpapa/code/papatutorialのフォルダにターミナルで移動し、以下のコマンドを実行します。

$ ./manage.py startapp persons
すると、以下の構造が出来上がると思います。

papaturtorial - manage.py
                       papatutorial - __init__.py
                                           - settings.py
                                           - urls.py
                                           - wsgi.py

                       persons        - __init__.py
                                           - models.py
                                           - tests.py
                                           - views.py

では、persons/models.pyを開いて、モデルを定義します。
欲しい項目としては、
id
first_name (名)
last_name (姓)
first_name_yomi (名読み)
last_name_yomi (姓読み)
email_address (Eメール)
face (顔写真)と行った項目でしょうか。

ちょっと説明が長くなるので顔写真はまた後でやりたいと思います。

良く使われるプライマリキーのIDは自動で作成されるので、
そのほかの項目をmodels.pyに以下の用に定義します。



from django.db import models

class Person(models.Model):
    first_name = models.CharField(u'名', max_length = 256)
    last_name = models.CharField(u'姓', max_length = 256)
    first_name_yomi = models.CharField(u'名読み', max_length = 256)
    last_name_yomi = models.CharField(u'姓読み', max_length = 256)
    email_address = models.EmailField(u'Emailアドレス', max_length = 256) #default max_length is 75 
    #face = models.FileField('Images', upload_to="images")

models.の後にどのような値が可能かに関しては公式ドキュメントを参考にしてください。
英語ですが、モデルのフィールドを書く上での紹介はこちら
そして、モデルに関しての詳しい紹介はこちらです。

もっと、Djangoに詳しくなったら翻訳チームにも参加したいと思っています。
とりあえず、モデルができたので、これをDBに反映させましょう。

まず、このモデルはどんなSQLを生成するのでしょうか?
/programmingpapa/code/papatutorialのフォルダに戻り次のコマンドを実行

$ ./manage.py sql persons
すると、以下の構造が出来上がると思います。
と思ったら以下のエラーが帰ってきてしまいました。
Error: App with label persons could not be found. Are you sure your INSTALLED_APPS setting is correct?
はじめに./manage.py startapp personsを実行してpersonsアプリを作ったのですが、それを設定ファイルに記していないので、personsアプリが認識されていないのですね。
papatutorial/papatutorial/settings.pyにpersonsを追加します。
以下のように記述します。

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'persons',
)

では、もう一度

$ ./manage.py sql persons
私の環境では、またエラーが出てしまいました。
SyntaxError: Non-ASCII character '\xe5' in file /programmingpapa/code/papatutorial/persons/models.py on line 4, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

文字コードに関して文句を言われているようです。
persons/models.pyを開くとちゃんとUTF-8にはなっているのですが、UTF-8, with BOMに変える必要があるみたいです。
再度チャレンジ

$ ./manage.py sql persons

すると、こんどは、ちゃんと以下の構造が出来上がると思います。


BEGIN;
CREATE TABLE `persons_person` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `first_name` varchar(256) NOT NULL,
    `last_name` varchar(256) NOT NULL,
    `first_name_yomi` varchar(256) NOT NULL,
    `last_name_yomi` varchar(256) NOT NULL,
    `email_address` varchar(256) NOT NULL
)
;
COMMIT;

生成されるテーブルの命名規則

実際に仕事でプロジェクトを作成するときなどはテーブル名などが指定されていると思います。Djangoでは、デフォルトでは、アプリケーション名_モデル名という規則で、SQL文が作られます。でも、テーブルをモデル名だけで作りたい、または、指定した名前で生成したい場合は、models.pyを以下の用に変更します。
from django.db import models
from django.db import models

class Person(models.Model):
    first_name = models.CharField(u'名', max_length = 256)
    last_name = models.CharField(u'姓', max_length = 256)
    first_name_yomi = models.CharField(u'名読み', max_length = 256)
    last_name_yomi = models.CharField(u'姓読み', max_length = 256)
    email_address = models.EmailField(u'Emailアドレス', max_length = 256) #default max_length is 75 
    #face = models.FileField('Images', upload_to="images")
    
    class Meta:
        db_table = 'person'
    
Metaインナークラスを作成し、db_tableを定義して、そこに、作成したいDBテーブルの名前を記載します。
もう一度コマンドを実行します。

$ ./manage.py sql persons

すると、こんどは、ちゃんと以下の構造が出来上がると思います。



BEGIN;
CREATE TABLE `person` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `first_name` varchar(256) NOT NULL,
    `last_name` varchar(256) NOT NULL,
    `first_name_yomi` varchar(256) NOT NULL,
    `last_name_yomi` varchar(256) NOT NULL,
    `email_address` varchar(256) NOT NULL
)
;
COMMIT;

テーブルがpersonで生成されていますね。
では、実際にMySqlに反映させてみましょう。

./manage.py syncdb
Creating tables ...
Creating table person
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

Creating table personと表示されていますね。これで、データベースが生成されているはずです。では、次のブログポストでは、管理画面を使用して実際にデータを入れていってみましょう。

No comments:

Post a Comment