2017-06-16 111 views
0

我有了六个属性bar1bar2bar3bar4bar5bar6数据存储区实体Foo。它们包含一对值,如下所示。搜索GAE数据存储属性

UserID bar1 bar2 bar3 bar4 bar5 bar6 
Mr. X A,B C,D E,F A,D C,E, B,F 
Mr. Y F,D A,C E,B A,D C,E B,F 

我的目标是检查ABCDEF是否有任何给定的字母出现在任何财产bar1bar2bar3bar4bar5bar6Mr. X

我已阅读GAE的NDB查询文档。我看到一个属性是否有多个值,即bar3 IN ['python', 'ruby', 'php']是否是可测试的。但不是像'python' IN [bar1, bar2, bar3, bar4, bar5, bar6]这样的情况。

我也读过repeated=True案例引起的并发症。

需要帮助以最有效的方式构建测试。 有什么帮助吗?

+0

听起来像是为SEACH API的工作。或者,也许添加一个ComputedProperty,它是所有'barX'列表的串联 – GAEfan

回答

0

我同意GAEFan ComputedPorperty或Search API会更好。但是你可以使用ndb.or把工作没有canging模型完成的:

from google.appengine.ext import ndb 

class Foo(ndb.Model): 
    user = ndb.StringProperty() 
    bar1 = ndb.StringProperty(repeated = True) 
    bar2 = ndb.StringProperty(repeated = True) 
    bar3 = ndb.StringProperty(repeated = True) 

Foo(user='Mr X', bar1=['A','B'],bar2=['C','D'],bar3=['E','F']).put() 
Foo(user='Mr Y', bar1=['F','D'],bar2=['B','C'],bar3=['E','B']).put() 

for res in Foo.query(ndb.OR(Foo.bar1 == 'A', Foo.bar2 == 'A', Foo.bar3 == 'A')): 
    print res.user 

输出

"Mr X"