【问题标题】:Combining Django Q Object Lookups into One Filter将 Django Q 对象查找组合到一个过滤器中
【发布时间】:2017-02-22 07:42:13
【问题描述】:

我在使用 Q 对象查找时遇到问题,而当用户搜索多个术语时,除非所有术语都在同一个对象中,否则搜索不会返回任何内容。

如果您转到https://www.soledadmemorial.com/plaques 并搜索David S Hackley,则搜索不会返回任何内容,但如果您只搜索David S,则会得到结果。

我尝试过像(Q(first_name__icontains=query), Q(last_name__icontains=query)) 这样组合过滤器,但只是得到一个错误。以下是我当前的代码。无需将多个对象的搜索组合在一起即可。

...
if query:
   queryset_list = queryset_list.filter(
     Q(first_name__icontains=query) |
     Q(last_name__icontains=query) |
     Q(branch__icontains=query) |
     Q(rank__icontains=query) |
     Q(group__group_name__icontains=query) |
     Q(veteran__name__icontains=query)
).distinct()
...

【问题讨论】:

  • 我不明白你的意思是从多个对象中组合搜索
  • Django 实际生成的查询是什么,你期望什么?

标签: python django django-templates django-views


【解决方案1】:

icontains 被翻译成数据库

ILIKE '%query_text%'

当您搜索 David S 时,它会发现它是 first_name。

你没有

ILIKE '%David S Hackley%' 

因为你在数据库中的任何列,所以 icontains 不会在这里做。

您应该考虑使用SearchVector ( postgres ) 甚至haystack

【讨论】:

  • 谢谢。我投了赞成票,因为您解释了正在发生的事情,而不仅仅是提供指向另一种方法的链接。
  • 编辑了小修复,因为它是使用 ILIKE 的图标
猜你喜欢
  • 2018-12-19
  • 2012-10-16
  • 2010-12-31
  • 2010-12-31
  • 2011-04-28
  • 2011-02-12
  • 2021-10-30
  • 2021-10-01
  • 1970-01-01
相关资源
最近更新 更多