Если это модель 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 () использует имя свойства "Python", а _properties индексируется именем свойства "хранилище данных".Они отличаются только тогда, когда свойство было объявлено с чем-то вроде
class MyModel(ndb.Model):
foo = StringProperty('bar')
Здесь имя Python - foo, а имя хранилища данных - bar.