【问题标题】:Django, how to use filter to check if string field is contained in parameterDjango,如何使用过滤器检查参数中是否包含字符串字段
【发布时间】:2016-10-13 09:42:31
【问题描述】:

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

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

现在,我知道如何检查参数字符串(让我们称变量“querystring”是否包含在字段关键字中:

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

但是说,我想提取关键字字段包含在查询字符串中的所有行/对象?例如,如果查询字符串包含“在 django 中,我如何创建过滤器”?然后我希望结果包含其关键字字段具有值 'django'、'filter' 等的所有对象......

【问题讨论】:

  • 查询字符串包含该字段?与包含模型字段名称的查询字符串的值一样?
  • @RajeshYogeshwar,如在查询字符串的值中包含模型字段的值...
  • 您当前的示例不正确,除非querystring 实际上是字符串"querystring"。然后 SQL 等价物是 SELECT ... WHERE keyword IKE '%querystring%'。这可能会导致您对您的问题是什么以及可能的答案感到困惑。
  • @RVC 这就是我问的。您正在尝试对字段名称本身进行 LIKE 查询。我可以确切地知道相同的目的,以便更好地了解您要实现的目标吗?
  • 您正在匹配输入句子中的单词,afaict。但是您必须具体说明您的问题是否真的如此。标点符号或空格呢?包括还是排除那些?诸如“在 StackOverflow 的问题中搜索”之类的所有格或“不是”之类的缩写词呢?

标签: python django


【解决方案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,根据this answer)。

【讨论】:

  • 应该是'Q(keyword__icontains=word)',双下划线
  • 它说 Q() 是未定义的变量
  • @FaizHameed 将其导入:from django.db.models import Q
【解决方案2】:

这是一个解决方案,它将选择 SomeModel 行,其 keyword 是查询字符串的任何子字符串,而不仅仅是完整的单词:

SomeModel.objects\
    .annotate(querystring=Value(querystring, output_field=CharField()))\
    .filter(querystring__icontains=F('keyword'))

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

【讨论】:

    猜你喜欢
    • 2022-08-08
    • 1970-01-01
    • 2019-02-04
    • 2014-09-02
    • 1970-01-01
    • 2018-08-20
    • 2017-09-23
    • 2013-11-20
    相关资源
    最近更新 更多