NDB查询过滤

问题描述:

与NDB,并就您需要使用类似语法查询使用过滤器的新的查询类:NDB查询过滤

qry = MyModel.query(MyModel.title == 'title') 

我怎样才能在模型上查询在不知道提前查询哪些属性?

与“旧”的方式,我曾与键和值来查询字典和环绕在键和值:

kwargs = {'title' : 'mytitle', 
      'age' : 34 } 

q = MyModel.all() 

for kw, vals in kwargs.items(): 
    if not isinstance(vals, (list, tuple)): 
     vals = (vals,) 
    for v in vals: 
     q.filter('%s =' % kw, v) 

我怎么能与NDB实现这一目标?

如果它是在Expando模型,或者如果你不在乎验证属性名称,你可以做到这一点很容易地使用GenericProperty:按名称

kwargs = {'title' : 'mytitle', 
      'age' : 34 } 

q = MyModel.query() 

for kw, vals in kwargs.items(): 
    if not isinstance(vals, (list, tuple)): 
     vals = (vals,) 
    for v in vals: 
     q = q.filter(ndb.GenericProperty(kw) == v) 

另外,如果你只是想找到一个现有的属性(在模型中定义的子类),你可以使用_properties类属性,如

 q = q.filter(MyModel._properties[kw] == v) 

甚至使用GETATTR()从类得到它:

 q = q.filter(getattr(MyModel, kw) == v) 

不同的是,GETATTR()使用该属性的“巨蟒”的名字,而_properties被索引的“数据存储“属性的名称。这些区别仅在于当地产宣布与像

class MyModel(ndb.Model): 
    foo = StringProperty('bar') 

这里的Python名是foo,但数据存储的名称是吧。

+0

谢谢。甚至不知道我为什么不考虑这个... – aschmid00 2012-03-21 17:50:09

+0

这允许动态属性。有没有办法允许动态运营商以及如? – 2014-08-17 15:40:34

+1

好的,在上面的问题得到了答案:http:// *。COM /问题/ 8766150 /如何到创建-A-查询的匹配密钥。基本上,使用ndb.query.FilterNode(“name”,“=”,value)来构造过滤器 – 2014-08-17 16:02:48

你仍然可以做到这一点用字典 - 键只是需要模特属性而不是字符串,像这样:

kwargs = {MyModel.title : 'mytitle', 
      MyModel.age : 34 } 
q = MyModel.query() 
for prop, value in kwargs.items(): 
    q = q.filter(prop == value) 
+0

我相信这不是100%正确的:[NDB查询对象是不可变的](http://code.google.com/appengine/docs/python/ndb/queries.html#filter_by_prop)。所以,你的代码中的最后一行应该是这样的:“q = q.filter(prop == value)” – alex 2012-03-21 09:47:19

+0

这不完全是我所需要的。我只有财产标签作为一个字符串。所以没有MyModel.title,但只有'标题'。有没有办法通过字符串获取模型属性? – aschmid00 2012-03-21 11:48:04

+0

@alex糟糕,这是从数据库的变化,我不知何故错过了。我会解决我的答案。 – 2012-03-22 09:07:50