说,我有一个带有文本字段的模型:
class SomeModel
keyword=models.CharField(null=True, max_length=255)
现在,我知道如何检查参数字符串(让我们调用变量" querystring"包含在字段关键字中:
results = SomeModel.objects.filter(keyword_icontains=querystring).all()
中找到了
问题,如何过滤querystring变量中包含字段值的对象?
道歉,如果我的问题令人困惑......也许一个例子会澄清...... 在django docs中,如果我的关键字字段包含例如' python-django',则对于包含' django'的查询字符串,我可以提取包含该字段的对象
results=SomeModel.objects.filter(keyword_icontains=querystring).all()
or results=SomeModel.objets.filter(keyword_icontains='django').all()
但是,我想提取其查询字符串中包含关键字字段的所有行/对象?例如,如果查询字符串包含'在django中,如何创建过滤器'?那么我希望结果包含关键字字段具有值' django',' filter'等等的所有对象...
答案 0 :(得分:1)
你必须将你的输入分成单词(取决于你对“单词”的定义),然后迭代它们,连接各种结果查询集(大多数可能是空的)。
要拆分,你可以使用正则表达式,捕获所有字母和撇号(但如果有人使用它作为输入而不是标准的ASCII撇号,你会错过一个智能引用):
words = re.split(r"[^A-Za-z']+", querystring)
然后循环并过滤:
query = Q() # empty Q object
for word in words:
# 'or' the queries together
query |= Q(keyword_icontains=word)
results = SomeModel.objects.filter(query).all()
上面的代码未经测试,我想到了'或'来自this answer的查询和空Q()。
根据您的下一步,在每个循环步骤中直接评估查询,附加到results
列表,可能对您更有效(使用例如itertools.chain
,按{{3 }})。
答案 1 :(得分:1)
这是一个解决方案,将选择SomeModel
行,其中keyword
是查询字符串的任何子字符串,而不仅仅是完整的单词:
SomeModel.objects\
.annotate(querystring=Value(querystring, output_field=CharField()))\
.filter(querystring__icontains=F('keyword'))
请参阅文档,以获取有关annotate,Value expressions和F expressions的信息