从具有不同数量的值的列表进行查询

时间:2017-05-31 22:50:07

标签: django postgresql django-queryset

我有以下列表:

list1 = ['blue', 'red']
list2 = ['green', 'yellow', 'black']

如何创建搜索所有值的查询(使用postgresql)。

这样可以正常工作,但只对两个值进行硬编码,因此不会处理不同数量的列表值。

entry.objects.annotate(search=SearchVector('colors')).filter(search=SearchQuery('blue') | SearchQuery('red'))

我尝试了以下操作来创建'search_query'字符串并将其放在我的查询中:

for c in color:
   search_string += "SearchQuery('" + c +"') | "

search_string = search_string[:-3]

这将导致以下search_strings

SearchQuery('blue') | SearchQuery('red')
SearchQuery('green') | SearchQuery('yellow') | SearchQuery('black')

如果我现在将此字符串放在我的查询中,它将无效。

entry.objects.annotate(search=SearchVector('colors')).filter(search=search_string)

感谢您解决此问题的任何帮助。

链接到django postgres搜索文档:https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/search/

2 个答案:

答案 0 :(得分:2)

我不知道postgreSQL但是:

# Can run this query with SQL (i think django query auto convert for each type of DataBase???)
res = Models.Objects.filter(color__in = list1)
more_res = Models.Objects.filter( Q(color__in = list1) | Q(color__in = list2))

Django查询基本(我不知道它是否适合你?)

答案 1 :(得分:1)

您的search_string无效,因为它是一个字符串。

您可以使用eval使其正常工作。试试这个:

entry.objects.annotate(search=SearchVector('colors')).filter(search=eval(search_string))

虽然这不是最好的方式。看看this