在MongoEngine中链接查询

时间:2013-08-11 07:35:24

标签: python mongodb rest flask mongoengine

我正在为标准CRUD应用程序实现REST API。在一个示例中,为了获得用户列表,客户可以调用:

GET api.site.com/users (以及可选) ?name=x phone=x email=x

传递上述可选参数会过滤我搜索的用户。

我正在尝试在Python中实现这个逻辑。我正在考虑链接子查询,如下:

假设:

users = User.objects()

然后:

if 'name' in request.args:
    users = users.objects(name = request.args['name'])

# List of users is smaller after filtering by name
if 'phone' in request.args:
    users = users.objects(phone = request.args['phone'])

# List of users is smaller after filtering by phone
if 'email' in request.args:
    users = users.objects(email = request.args['email'])

但该方法不可用,我无法通过检查MongoEngine API参考或用户指南或教程来了解如何执行此操作。

如何在MongoEngine中链接子查询?

2 个答案:

答案 0 :(得分:6)

由于mongoengine supports keyword arguments to the objects call,您可以创建一个字典,其中为field_names,为field_values。然后在查询时使用这个字典。例如:

query = {}

if 'name' in request.args:
    query['name'] = request.args['name']

if 'phone' in request.args:
    query['phone'] = request.args['phone']

if 'email' in request.args:
    query['email'] = request.args['email']

user = User.objects(**query)

以上只是一个示例,您可能希望添加安全措施,并且可能有默认查询,具体取决于您的应用。

答案 1 :(得分:0)

http://docs.mongoengine.org/apireference.html#mongoengine.queryset.QuerySet.__call__ mongoengine.QuerySet对象本身是可调用的。只需调用结果查询集即可完成链接查询。

users = User.objects()

if 'name' in request.args:
    users = users(name = request.args['name'])

if 'phone' in request.args:
    users = users(phone = request.args['phone'])

if 'email' in request.args:
    users = users(email = request.args['email'])