この記事のURL

http://www.dango-itimi.com/blog/archives/2013/001159.html


FLASH tips Google App Engine(GAE/python): DataStore内 None値以外を取得し日付で並び替え

記事タイトルの方法がわからず、某巨大掲示板で質問したところ解決方法を教えていただいたのでメモです。

以下の様な 文字列と日付だけをデータストアに記録する MyModel があったとします。

class MyModel(ndb.Model)
	message = ndb.StringProperty()
	date = ndb.DateTimeProperty(auto_now_add=True)

message は None 値が挿入される場合があり、message が None 値ではないデータを取得するために、以下の記述を行なっていました。

q = MyModel.query(MyModel.message > None)

ここで更に MyModel.date による並び替えを行う条件式を付け加えたい所ですが、データストアの制約上 次の記述ではエラーとなってしまいます。

#error
q = MyModel.query(MyModel.message > None).order(MyModel.date) 

等式以外の条件式を利用した場合等、結構制限事項があります。ややこしくてあまり理解していません。

 参考) Google App Engine クエリに関する制限
 https://developers.google.com/appengine/docs/python/datastore/queries?hl=ja#Restrictions_on_Queries

上記解決する方法としまして、MyModel を以下のように変更します。

class MyModel(ndb.Model)
	message = ndb.StringProperty()
	message_exists = ndb.BooleanProperty(default=False)
	date = ndb.DateTimeProperty(auto_now_add=True)

message にデータを挿入する際、message が存在するのであれば message_exitst を True に設定します。

そして message が存在するデータを日付で並び替えるには、以下の様な条件式を記述すればよしとなります。

q = MyModel.query(MyModel.message_exitst == True).order(MyModel.date) 

[ FLASH ] [ tips ] 投稿者 siratama : 2013年02月16日 15:51

トラックバック

http://www.dango-itimi.com/blog/mt-tb.cgi/1119

コメント

以下コメントを書き込むだけでは、管理人には通知が行われません。通知を行いたい場合、管理人の書き込みに「返信」を押してコメントをしていただくか、あるいは Google+, Twitter へご連絡ください。




[EDIT]