我有以下列表:
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/
答案 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