2016-06-13 105 views
-1

说如何使用过滤器来检查,我有一个文本字段的模型:Django的,如果字符串字段包含在参数

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

现在,我知道如何检查的参数字符串(允许调用变量“查询字符串”包含在现场关键字:

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

我在django docs

问题,我该如何过滤其字段值中包含的对象找到查询字符串变量?

道歉,如果我的问题令人困惑...也许一个例子将澄清... 在Django文档中,如果我的关键字字段包含,例如,'python-django',那么,对于包含'django ”,我可以提取包含带有

results=SomeModel.objects.filter(keyword_icontains=querystring).all() 
or results=SomeModel.objets.filter(keyword_icontains='django').all() 

该字段的对象,而是说,我想提取其关键字字段包含在查询字符串的所有行/对象?例如,如果querystring包含“在Django中,我该如何创建一个过滤器”?那么我希望结果包含所有其关键字字段的值为'django','filter'等的对象...

+1

包含字段的Querystring?正如包含模型字段名的querystring的值一样? –

+0

@RajeshYogeshwar,在查询字符串的值中包含模型字段的值... – RVC

+0

您当前的示例不正确,除非'querystring'实际上是字符串'“querystring”''。然后SQL的等价物就是'SELECT ... WHERE关键字IKE'%querystring%''。可能的是,这对您的问题是什么以及可能的答案造成混淆。 – Evert

回答

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() 

上面的代码是未经测试,我上心到“或”的查询和一个空的Q()从this answer

根据您的下一个步骤(S),直接在每个循环步骤评估查询,追加到results名单,可能会更好地为您(使用例如itertools.chain,按照this answer)。