如何使用Django.db.modelsQ模块查询多行用户输入的文本数据

How can I use Django.db.models Q module to query multiple lines of user input text data

我将如何使用 django.db.models Q 模块从使用 <textarea> html 输入字段的数据列表中查询多行输入?我可以使用普通的 html <input> 字段查询单个对象。我尝试使用与我的输入字段相同的代码,除了在请求输入数据时,我尝试像这样拆分行:

  def search_list(request):
    template = 'search_result.html'
    query = request.GET.get('q').split('\n')
    for each in query:
        if each:
            results = Product.objects.filter(Q(name__icontains=each))

这当然行不通。我查询一行数据(有效)的代码是这样的:

  def search(request):
    template = 'search_result.html'
    query = request.GET.get('q')
    if query:
        results = Product.objects.filter(Q(name__icontains=query))

我基本上只是想在我的数据库中搜索用户输入到列表中的数据列表,然后 return 所有这些结果都用一个查询。非常感谢您的帮助。谢谢。

根据您的意见,您希望对给定的 q 字符串实施 OR 逻辑。

我们可以通过 reduce-ing 一个 Q 对象的列表来创建这样的 Q 对象,每个对象指定一个 Q(name__icontains=...) 约束。我们用 "logical or"(Python | 中的管道)来减少它,例如:

from django.db.models import <b>Q</b>
from functools import <b>reduce</b>
from operator import <b>or_</b>

def search_list(request):
    template = 'search_result.html'
    results = Product.objects.all()
    error = None
    query = request.GET.get('q')
    if query:
        query = query.split('\n')
    else:
        error = 'No query specified'
    if query:
        results = results.filter(
            <b>reduce(or_, (Q(name__icontains=itm.strip()) for itm in query))</b>
        )
    elif not error:
        error = 'Empty query'
    some_context = {
        'results' : results,
        'error': error
    }
    return render(request, 'app/some_template.html', some_context)

这里我们首先检查q是否存在并且不是空字符串。如果是这样,则错误为 'No query specified'。如果有查询,我们拆分该查询,接下来我们检查查询中是否至少有一个元素。如果不是,我们的错误是 'Empty query'(请注意,这可能 不会 发生在普通的 .split('\n') 上,但也许您对列表进行后处理,例如删除空的元素)。

如果query中有元素,我们执行reduce(..)函数,从而过滤Product

最后,我们 return 一个 render(..)ed 响应 some_template.html,以及一个包含 errorresult 的上下文。