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,但数据存储的名称是吧。
你仍然可以做到这一点用字典 - 键只是需要模特属性而不是字符串,像这样:
kwargs = {MyModel.title : 'mytitle',
MyModel.age : 34 }
q = MyModel.query()
for prop, value in kwargs.items():
q = q.filter(prop == value)
我相信这不是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
这不完全是我所需要的。我只有财产标签作为一个字符串。所以没有MyModel.title,但只有'标题'。有没有办法通过字符串获取模型属性? – aschmid00 2012-03-21 11:48:04
@alex糟糕,这是从数据库的变化,我不知何故错过了。我会解决我的答案。 – 2012-03-22 09:07:50
谢谢。甚至不知道我为什么不考虑这个... – aschmid00 2012-03-21 17:50:09
这允许动态属性。有没有办法允许动态运营商以及如? – 2014-08-17 15:40:34
好的,在上面的问题得到了答案:http:// stackoverflow。COM /问题/ 8766150 /如何到创建-A-查询的匹配密钥。基本上,使用ndb.query.FilterNode(“name”,“=”,value)来构造过滤器 – 2014-08-17 16:02:48