ListProperty はただの Property にあらず

ListProperty クエリの比較演算子は、他の Property クエリとは異なる振る舞いを示します。

クエリでは、リスト プロパティと値を比較してリスト メンバーを照合します。たとえば、list_property = value は値がリスト内に存在するかどうかを調べ、list_property < value はリストのメンバーが指定された値より小さいかどうか調べます。

StringListPropertyListProperty(basestring) に等しい)の場合、>< 演算子アルファベット順の大小が評価されます。

また、IN 演算子list_property 要素のいずれかが比較対象リストに一つでも含まれていれば、エンティティが抽出されます。


例として、以下の Test モデルを定義し、エンティティを一つ作成します。

from google.appengine.ext import db

class Test(db.Model):
  str_list = db.ListProperty(basestring)

Test(str_list=['a', 'b', 'c']).put()  # エンティティを作成


ここで作成したエンティティは、以下のクエリによって抽出されます。

Test.all().filter('str_list =', 'a')  # OK
# (str_list は 'a' を含む)

Test.all().filter('str_list =', 'd')  # None
# (str_list は 'd' を含まない)


Test.all().filter('str_list >', 'b')  # OK
# (str_list は 'b' より大きい文字列 'c' を含む)

Test.all().filter('str_list >', 'c')  # None
# (str_list は 'c' より大きい文字を含まない)


Test.all().filter('str_list IN', ['b', 'd'])  # OK
# (str_list は 'b', 'd' のいずれかを含む)

Test.all().filter('str_list IN', ['d', 'e'])  # None
# (str_list は 'd', 'e' のいずれも含まない)