【问题标题】:How to implement my own search filter - Django?如何实现我自己的搜索过滤器 - Django?
【发布时间】:2021-12-27 11:30:15
【问题描述】:

我有一个图书模型:

class Book(models.Model):
    title = models.CharField()
    ...

HTML 表单:

<form type="get" action=".">
    <input id="search_box" type="text" name="search_box"  placeholder="Search..." >
    <button type="submit" >Submit</button>
</form>

例如: 用户在我的表单中输入了一些文本:“一些奇怪的文本” 我想找到所有书籍,其中至少包含一个大写或小写的单词或此文本中的一些短语('Some','some','Strange','strange','Text','text'或'一些奇怪的','奇怪的文字'等等)。 我该怎么做?

【问题讨论】:

  • 您的模型中的字段中是否有书的文本?也就是说,在数据库中?还是您只想在书名中搜索?
  • “文本”是指书名。是的,它是
  • 我是否正确理解您想通过“或-ing”输入的各个单词进行搜索?所以文本可能包含“some”“strang”“text”(忽略大小写)?
  • 是的,如果我输入“cafe”,它应该会找到诸如“The why cafe”、“Cafe number 233”之类的书...
  • 那么 Willem 的回答,使用 Q 对象一起进行或运算,应该可以解决您的问题。

标签: python django filter


【解决方案1】:

您可以拆分搜索查询以获取单词,然后将其与书名匹配。我们可以通过构造一个表示过滤条件的Q object [Django-doc] 来做到这一点:

from django.db.models import Q

query = request.GET.get('search_box')
books = Book.objects.all()
if query:
    query = query.split()
    q_obj = Q(
        *[Q(('title__icontains', item)) for item in query],
        _connector=Q.OR
    )
    books = Book.objects.filter(q_obj)

如果搜索框被填写,它将过滤books查询集,使其至少包含查询的一个词。

【讨论】:

  • 示例中的 Q 是什么?
  • 另外,contain 和 icontain 有什么区别?
  • @СтопчакОлег: Q 是一个对象,用于呈现用于过滤的查询部分。 icontains 将匹配不区分大小写,而 contains 将匹配区分大小写。
猜你喜欢
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 2023-03-03
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多