ORing фильтры вместе в Pony ORM - PullRequest
       21

ORing фильтры вместе в Pony ORM

0 голосов
/ 18 декабря 2018

Я хотел бы динамически построить запрос, используя Пони , но я бы хотел объединить фильтры с OR вместо AND.То есть я хочу сделать что-то вроде этого:

keywords = ['gizmo', 'gadget']
query = select(w for w in Widget)
for kw in keywords:
  query = query.filter(lambda w: kw in w.name)

for item in query:
  print(item)

Проблема с вышеприведенным, конечно, заключается в том, что он выдаст запрос, подобный:

SELECT "w"."id", "w"."name"
FROM "Widget" "w"
WHERE "w"."name" LIKE '%gizmo%'
  AND "w"."name" LIKE '%gadget%'

В то время как я хочу:

SELECT "w"."id", "w"."name"
FROM "Widget" "w"
WHERE "w"."name" LIKE '%gizmo%'
  OR "w"."name" LIKE '%gadget%'

Есть ли способ туда добраться?

1 Ответ

0 голосов
/ 05 января 2019

В настоящее время вы не можете использовать фильтры с или.Когда-нибудь мы реализуем это.

Я могу дать вам некоторый обходной путь со строками.

В Pony вы можете использовать строковые версии генераторов или фильтров.Например,

select('w for w in Widget')

. Это может быть полезно, если вы используете какое-то выражение, которое Пони не может декомпилировать.Например,

select('s for s in Student if a < s.age < b')

Так что в вашем случае вы можете сделать это как

q = select(w for w in Widget)
q = q.filter(' or '.join('keywords[%d] in w.name' % i for i in range(len(keywords))))

Я использую for i in range, а не for kw in keywords, чтобы избежать инъекций Python, потому что этот код будет оценен.

...