Django 从模型中过滤:Model.objects.filter(Q())
Django filtering from models: Model.objects.filter(Q())
我需要使用 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)
我需要使用 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)