按条件顺序检索Django queryset

时间:2018-11-09 09:08:47

标签: django django-models django-queryset django-q

我正在尝试进行查询,以符合条件的顺序提供给我结果。 我尝试了以下方法:

 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 :(得分:1)

您可以使用chain。它执行以下操作:

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)