如何使用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
,以及一个包含 error
和 result
的上下文。
我将如何使用 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
,以及一个包含 error
和 result
的上下文。