GAEpでiPhone向けWebアプリを作る (5)GAEp 上にモデルを定義する

前回の続きです。

GAEp 上にモデルを定義する

ようやくGAEpのソースコードが出てきます。

モデルの整理

今回の ToDo アプリで必要な要件を整理します。
* ひとつの ToDo を表すアイテム(ToDo アイテム)が存在する
* ひとつの ToDo アイテムは、必ず誰かのアイテムである(必ず誰かが所有する)
* ひとつの ToDo アイテムには、いつまでに何をなすべきか、が指定されている
非常に簡単です。

モデルを定義する

以下のようにモデル(カインド)を定義します。

models.py内

from google.appengine.ext import db

class ToDoItem(db.Model):
  owner = db.UserProperty(required=True)
  title = db.StringProperty(required=True)
  detail = db.TextProperty()
  reg_date = db.DateTimeProperty(auto_now_add=True)
  deadline = db.DateTimeProperty(required=True)

GAEp のデータストアに格納するために、Model クラスを継承します。このクラスは、google.appengine.ext.db パッケージに格納されています。

ToDoItem クラスには、5つのプロパティが定義されています。

owner
ひとつ ToDo アイテムの所有者。必須
title
ToDo 内容。通常ここに何をすべきかを記載する。必須
detail
ToDo 内容の詳細。
reg_date
この ToDo アイテムの登録日
deadline
この ToDo アイテムの締め切り。必須

各データ項目は、Property クラスを継承した各クラスで定義しています。どのようなプロパティが GAEp で定義されているかは下記で確かめられます。

また、Property のコンストラクタに required 引数と auto_now_add 引数を使用しています。
required 引数は Properyty クラスのコンストラクタ引数です。これによりプロパティに None を入れるとエラーが返ります。他にもコンストラクタ引数があります。下記参照。

auto_now_add 引数は DateTimeProperty クラス固有のプロパティで、インスタンス作成時にその時点の時刻を自動で代入します。下記を参照してください。

deadline については、仕様的には DateProperty でも充分です。

モデルインスタンスの作成、変更、保存、削除

上記のように作成したモデルのインスタンス(エンティティ)のライフサイクルに関する操作を簡単に記載します。

エンティティの作成は、以下のようにします。

item = ToDoItem(owner=user, title=s_title, deadline=dt_deadline)

required なプロパティはコンストラクタ引数で初期化しています。これらを初期化しなければ、エラーとなります。

item = ToDoItem() # 必須なプロパティが初期化されていないのでエラー

コンストラクタ引数なしでエンティティ作成したい場合は、プロパティのコンストラクタ引数に default を None 以外の値で指定しておく

変更は以下のようにします。

item.detail = 'この ToDo アイテムの詳細はこれこれです'

required なプロパティには、None を代入できない点にだけ注意。

変更したら、保存は以下のようにします。

item.put()

コンストラクタで作成しただけではデータは保存されていません。保存は必ず put() メソッドで。

最後に、いらなくなったエンティティの削除は以下です。

item.delete()

今回はここまで。拍子抜けするくらい簡単です。

参考

Google App Engine については、基本的に Google が公開しているデベロッパーガイドを見ればだいたいのことはわかります。内容もわかりやすいです。

特に、Google App Engine Python については、以下です。

基本的にはこれらのサイトを見ればほとんどのことはわかりますが、その他に僕は以下の本を参考にしています。

Programming Google App Engine

Programming Google App Engine

和訳も出ているようです。

プログラミング Google App Engine

プログラミング Google App Engine