通过KeyProperty进行ndb查询

时间:2014-06-06 23:37:58

标签: google-app-engine app-engine-ndb

我在使用KeyProperty查询时遇到了困难,并且无法查看错误。

我的模特是

class MyList(ndb.Model):
  user = ndb.KeyProperty(indexed=True)
  status = ndb.BooleanProperty(default=True)
  items = ndb.StructuredProperty(MyRef, repeated=True, indexed=False) 

我使用适当的数据创建MyList实例,并且可以正确运行以下内容

cls = MyList
lists = cls.query().fetch()

返回

[MyList(key=Key('MyList', 12), status=True, items=..., user=Key('User', 11))]

但是当我尝试按用户过滤时失败,即查找用户等于特定实体的列表;即使使用我刚刚用于插入的那个,或者使用之前的查询结果。

key = lists[0].user
lists = cls.query(cls.user=key).fetch()

返回

[]

但使用status=True作为过滤器可以正常工作,而且我看不到有什么遗漏?

我应该添加它发生在具有以下v3_stub

的单元测试环境中
self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(probability=0)                                   
self.testbed.init_datastore_v3_stub(                                                                               
  require_indexes=True,                                                                                      
  root_path="%s/../"%(os.path.dirname(__file__)),
  consistency_policy=self.policy
)

2 个答案:

答案 0 :(得分:0)

user=Key('User', 11)是另一个类的关键:User。不是MyList

也许你的意思是:

user = ndb.KeyProperty(kind='User', indexed=True)

答案 1 :(得分:0)

您的代码看起来很好,但在使用NDB进行本地开发时,我注意到了一些数据完整性问题。我复制了你的模型和代码,我最初也得到了空列表,但经过几次尝试后,数据就在那里。

尝试几次?

编辑:可能相关? google app engine ndb: put() and then query(), there is always one less item