ListProperty はただの Property にあらず
ListProperty クエリの比較演算子は、他の Property クエリとは異なる振る舞いを示します。
クエリでは、リスト プロパティと値を比較してリスト メンバーを照合します。たとえば、list_property = value は値がリスト内に存在するかどうかを調べ、list_property < value はリストのメンバーが指定された値より小さいかどうか調べます。
StringListProperty(ListProperty(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' のいずれも含まない)