Получение набора запросов Django в порядке условий
Я пытаюсь сделать запрос, который дает мне результаты в том порядке, в котором у меня есть условия. Я пробовал следующее:
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 ответ
Решение
Вы можете использовать цепь. Это делает следующее:
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)