libro
www.tuyano.com
PythonによるGoogle App Engine(GAE)プログラミング入門

複数モデルの連携処理 (6/6)

作成:2010-01-08 11:12
更新:2010-05-10 22:04

■メンバーが書いたメッセージをすべて取り出す

これだけなら、「なるほどな」で終わりかも知れません。データストアの面白いところは、「ReferencePropertyで関連するオブジェクトを保管すると、関連付けられたオブジェクトの側からもオブジェクトを取り出せるようになる」という点です。

例えば、ここではMessageDataクラスに、誰が送信したかを示すMemberDataをプロパティとして用意し関連付けています。すると、MemberDataクラスの側に、「そのMemberDataに関連付けられたMessageData」を取得するプロパティが自動的に用意されるのです。

先ほどのmember.htmlに記述してあった、MemberDataの一覧を出力するテーブル(<hr />タグ以降の部分)を、以下のリストのように書き換えてみてください。そして、アクセスしてみましょう。すると、それぞれのメンバー情報の下に、そのメンバーが投稿した全メッセージが表示されるようになります。

ここでは、{% for msg in data.messages %}というような繰り返し処理が追加されていますね。これで、取り出したMemberDataの「messages」というプロパティから順にMessageDataオブジェクトを取り出し、処理しているのです。

先に、MessageDataモデルのmemberプロパティを定義したとき、「collection_name='messages'」という引数指定がされていたのを思い出してください。実は、この'messages'という値が、MessageDataに作成されているプロパティ名だったのです。collection_nameという値にプロパティ名を指定することで、ReferencePropertyを使い相互に関連する相手のオブジェクトを参照することができるようになるのです。

もし、collection_nameの指定を忘れた場合には、「モデル名_set」という名前でプロパティが自動的に用意されます。例えば、ここでは「messagedata_set」というプロパティが用意されるわけです。

この「ReferencePropertyによるモデルの相互参照」は、実に強力で便利です。モデルの連携処理を行う場合には必須となる機能ですので、しっかり覚えておきましょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

	<hr />
	<table border="1" width="500px">
		<tr>
		<th width="50px">ID</th>
		<th width="200px">メンバー</th>
		<th width="200px">アカウント</th>
		<th width="100px">電話</th>
		</tr>
		{% for data in datas %}
		<tr>
		<td rowspan="2">{{data.key.id}}</td>
		<td>{{data.name}}</td>
		<td>{{data.user.nickname}}</td>
		<td>{{data.tel}}</td>
		</tr>
		<tr>
		<td colspan="3">
		{% for msg in data.messages %}
		<li>{{msg.message}}</li>
		{% endfor %}
		</td>
		</tr>
		{% endfor %}
	</table>

※関連コンテンツ

「PythonによるGoogle App Engine(GAE)プログラミング入門」に戻る