получение набора запросов Django в порядке условий - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь сделать запрос, который дает мне результаты в том порядке, в котором у меня есть условия. Я попробовал следующее:

 if query:
    word_list = query.split()
    for word in word_list:
       icons = icons.filter(
                   Q(name__iexact=word) |
                   Q(name__istartswith=word) |
                   Q(words__text__icontains=word) |
                   Q(name__icontains=word)
               ).distinct()

, а также

if query:
    word_list = query.split()
    for word in word_list:
       exact_icons = icons.filter(Q(name__iexact=word)).distinct()
       start_with_icons = icons.filter(Q(name__istartswith=word)).distinct()
       contains_icons = icons.filter(
                         Q(words__text__icontains=word) |
                         Q(name__icontains=word)
                     ).distinct()
       icons = exact_icons | start_with_icons | contains_icons

поэтому я хотел бы сначала получить точно совпадающие результаты, затем те, которые начинаются с и только в конце те, которые содержат слово, но ни одна из вышеупомянутых альтернатив, похоже, не работает. Любые идеи, как я могу сделать это? Спасибо

1 Ответ

0 голосов
/ 09 ноября 2018

Вы можете использовать цепочку . Это делает следующее:

list_a = ['A', 'B', 'C']
list_b = ['D', 'E', 'F']
print(list(chain(list_a, list_b)))
>>> ['A', 'B', 'C', 'D', 'E', 'F']

Здесь для использования во второй попытке:

from itertools import chain
...
icons = list(chain(exact_icons, start_with_icons, contains_icons))

Из-за обновленной информации:

from functools import reduce, import operator
words_qs = reduce(operator.or_, (Q(name__iexact=word) for word in words))
YourModel.objects.filter(..., words_qs)
...