首页 > 解决方案 > MongoEngine:构建过滤器查询

问题描述

我想构建一个过滤器查询,当我调用通用过滤器函数('filter_it('username', '=', 'test_user')。

最简单的例子:

# grab the user, apply filter
result = User.objects().filter(username="test_user")
# print result
print(result.get())

回报:

test_user

现在,如果我尝试使用变量:

# set query
query = 'username="test_user"'
# grab the user, apply filter
result = User.objects().filter(query)
# print result
print(result.get())

回报:

mongoengine.errors.InvalidQueryError: Not a query object: username="test_user". Did you intend to use key=value?

我尝试使用原始查询构建它,但没有设法让它工作。我也尝试过使用 .format() 无济于事。似乎自定义查询集可能会解决问题,但不能以我想要的方式应用。

有没有人有任何建议、想法或解释?我认为问题围绕将字符串作为查询对象传递,但我似乎无法在 mongoengine 文档中找到解释或替代方法。

标签: python-3.xmongoengine

解决方案


为了构建高级查询,您必须使用 Q 对象

Q 对象允许您使用和/或运算符 (&/|) 构建复杂的查询。

例如:

from mongoengine import Q


# set query
query = Q(username="test_user")
# grab the user, apply filter
result = User.objects()(query)
# print result
print(result.get())

结果

test_user

我们也可以这样做:

# set query
query = str("test_user")
# grab the user, apply filter
result = User.objects()(username=query)
# print result
print(result.get())

结果

test_user

据我所知,不可能使用变量来定义正在搜索的字段。

这失败了:

# set field
field = "username"
# set query
query = str("test_user")
# grab the user, apply filter
result = User.objects()(field=query)
# print result
print(result.get())

结果

mongoengine.errors.InvalidQueryError: Cannot resolve field "field"

每一个变化都失败了。


推荐阅读