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)