NDB фильтрация запросов по свойству (строка) - PullRequest
5 голосов
/ 21 марта 2012

с 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?

Ответы [ 2 ]

13 голосов
/ 21 марта 2012

Если это модель 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.

0 голосов
/ 21 марта 2012

Вы все еще можете сделать это с помощью словаря - ключи должны быть просто свойствами модели, а не строками, например:

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