2014-06-06 49 views
1

我正在努力与KeyProperty查询,并不能看到有什么问题。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 
) 
+1

这是最终一致性的产物。它在SDK中被模拟,并且在使用SDK进行测试时,您有几个关于如何模拟的选择。事实证明,你知道你可以检索实体,所以它存在。关闭开发环境中最终的一致性作为另一项检查。但是你必须在你的设计中处理这个问题。 –

+0

@TimHoffman:这是正确的,如果我设置概率= 1,它工作正常,谢谢!然而,我不明白为什么query()w/o参数可以工作,还有另一个过滤器(例如status = True)。这是否意味着,由于最终一致性,索引尚未创建?我认为最终一致性状态是“全部或全部”,而不是“中间”,就像在这种情况下,只有一些索引返回正确的数据。这是一个错误? – apassant

+0

我相信每个索引都可以在自己的时间更新。但是,您正在使用SDK,它至多是真实环境的近似值。您应该编写代码来处理SDK最终的行为,因为这可能是最糟糕的情况。如果你的设计可以解决这个问题,那么你可以处理生产。另一方面,如果您的设计只在设定概率= 1时才起作用,那么您处于滑坡并且在生产中会遇到问题。 –

回答

0

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

也许你的意思是:

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

关于不同的类,我试图找到钥匙是'User'实体,而不是'MyList'的值 - 我已经编辑了这个问题来说明这一点。我也尝试kind ='用户',同样的问题 – apassant