Django,如何使用filter来检查参数中是否包含字符串字段

时间:2016-06-13 04:28:15

标签: python django

说,我有一个带有文本字段的模型:

class SomeModel
    keyword=models.CharField(null=True, max_length=255)

现在,我知道如何检查参数字符串(让我们调用变量" querystring"包含在字段关键字中:

results = SomeModel.objects.filter(keyword_icontains=querystring).all()

我在django docs

中找到了

问题,如何过滤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'等等的所有对象...

2 个答案:

答案 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'))

请参阅文档,以获取有关annotateValue expressionsF expressions的信息