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

3

我需要使用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),因为它是一个字符串。 在这里有什么办法吗?或者架构错了吗?我应该创建一个自定义的模型管理器吗?

1个回答

3

以下是一种明确的实现方法:

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

非常感谢您,ozgul。它对我来说完美地运行! - megapihar753

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接