Django从模型中过滤:Model.objects.filter(Q())

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (117)

我需要使用django ORM在数据库中搜索一些数据,这应该是所有列都要搜索的。问题是我在作为参数进入函数之前不知道要搜索什么。

这是源代码:

search = request.GET.get('search_value')
#row_to_search is turple i get to function
#it could be different at every searching
#it looks like here:
rows_to_search = ('name', 'age', 'salary')

我需要在我的数据库中搜索这些行,如下所示:

query = Mymodel.objects.filter(Q(name__iregex=search) |      \
                               Q(age__iregex=search)  |      \
                               Q(salary__iregex=search))

如果我要搜索更多行,如何制作代码?

我试过这样的东西,但它接缝它根本不起作用:

Q_filter = map(lambda q: 'Q('+q+')', map(lambda s: s+'__regex='+search, rows_to_search))
searchline = '|'.join(Q_filter)

我不能打电话model.objects.filter(searchline),因为它是一个字符串。可以在这里做点什么,还是架构错了?我应该制作自定义模型管理器吗?

提问于
用户回答回答于

以下是明确执行此操作的一种方法:

>>> Q_filter = Q()
>>> for value in rows_to_search:
...     Q_filter |= Q(**{"{}__iregex".format(value): search})

这是单行使用reduce()

>>> Q_filter = reduce(lambda x, y: x | Q(**{"{}__iregex".format(y): search}), rows_to_search, Q())

使用operator.or_列表推导的另一个单线程:

>>> Q_filter = reduce(operator.or_, [Q(**{"{}__iregex".format(key): search}) for key in rows_to_search])

然后您可以按如下方式调用查询:

MyModel.objects.filter(Q_filter)

扫码关注云+社区

领取腾讯云代金券