@Sergey6661313

Возможно ли формировать динамически условия во время выполнения?

Я имею некий класс Person
и создаю некое "условие" примерно так:
условие = Person.select().where(
     #fn.Lower(Person.имя).contains(text.lower()) |   #кстати эта строчка не работает....
     Person.имя.contains(text) |
     Person.доп_имя.contains(text) |
     Person.тип.contains(text)
     ).order_by(Person.тип)

Где text - заранее введённый в lineEdit строчку текст
И пытаюсь совершить по нему поиск.
for pers in условие - всё работает.
Но вот допустим я хочу поискать не по одному слову а по нескольким словам сразу.
Я разделяю текст text используя text.split(" ")
и далее если например получается 2 слова :
if len(разделил_текст_поиска) == 2:
     условие = Detal.select().where\
          (
               (
               Personl.имя.contains(разделил_текст_поиска[0]) |
               Person.доп_имя.contains(разделил_текст_поиска[0]) |
               Person.тип.contains(разделил_текст_поиска[0])
               ) & (
               Person.имя.contains(разделил_текст_поиска[1]) |
               Person.доп_имя.contains(разделил_текст_поиска[1]) |
               Person.тип.contains(разделил_текст_поиска[1])
               )
          ).order_by(Person.тип)
ищу одно и тоже условие для каждого слова.
для 2-х слов условие возрастает двухкратно.
Для 3-х слов условие возрастёт траекратно.
Очевидно что тут возможно применить какие нибудь циклы. но я не знаю как правильно это делать...(да книжку проглядывал и даже немного читал буду рад если кто нибудь просто ткнёт носом какую главу в какой книжке прочесть. (только русскую.))
И буду очень рад если кто нибудь напишет как правильно применять fn.Lower - потому что у меня это сработало только дин раз с одной базой - а когда я создал в ней ещё 1 класс и просто скопировал - она уже перестала работать :( Возможно просто есть какой нибудь мало-упоминаемый подводный камень - которого я не вижу...

to Anton Kuzmichev:
насчёт fn lower: именно этот пример у меня сработал как минимум 1 раз. Но сейчас даже при простом тупом копировании оно не работает. И почему то везде предлагают его в связке с substr который мне по сути не нужен.

насчёт кортежей: Спасибо вам большое уменьшил код до
разделил_текст_поиска = text.split(" ")
filtr = True
for i in разделил_текст_поиска:
         filtr &= \
         (
              Person.имя.contains(i) |
              Person.доп_имя.contains(i) |
              Person.тип.contains(i])
         )
 условие = Person.select().where(filtr)

Теперь запрос может быть из любого количества слов. СПАСИБО!
  • Вопрос задан
  • 2378 просмотров
Решения вопроса 1
Assargin
@Assargin
Перед ответом смотрю наличие ✔ в ваших вопросах
Не знаю, что у вас за ORM (если это вообще он), в обычном Django ORM, когда мне надо было динамически сформировать запрос, я делал примерно так:
# кортеж с фильтрами
filters = (Q(field1='value1'), )
for value in values:  # перебираем итератор со значениями для фильтрации
    # добавляем в кортеж очередное условие через ИЛИ
    filters |= Q(field1=value)
queryset = MyModel.objects.filter(filters)

Пример немного высосан из пальца (можно было просто написать field1__in=values, грубо говоря), но показывает, как можно формировать динамически условия, комбинировать их как надо, и т.п.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы