如何在flask程序中获取mongoengine对象id

时间:2018-03-21 11:52:24

标签: python flask mongoengine

我正在使用mongoengine与flask集成,我想知道如何在每次尝试获取文档对象ID File "/var/www/flask_projects/iot_mongo/app.py", line 244, in post return jsonify(user.id) AttributeError: 'BaseQuerySet' object has no attribute 'id'

class Test(Resource):
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument('email',required=True, help='email')
        args=parser.parse_args()
        user=AdminUser.objects(email=args['email'])
        return jsonify(user.id)
api.add_resource(Test,'/test')

if __name__ == '__main__':
    app.run(debug=True) 

2 个答案:

答案 0 :(得分:2)

结帐the documentationDocument.objectsQuerySet个对象。

您似乎期待代码的这一部分

user=AdminUser.objects(email=args['email']) # user will be a QuerySet

会给你一个结果,但事实并非如此,它会给你QuerySet一个零或更多的结果。它没有属性id,这就是您在此处尝试访问此属性时收到错误消息的原因:

return jsonify(user.id) # QuerySet does not have the attribute id

你需要从中获取你想要的实际结果,假设你确定你的查询将返回一个结果,或者不关心可能有多个结果而只是想要第一个结果,你可能想要这些内容:

user=AdminUser.objects(email=args['email']).first() # extract first result
return jsonfiy(user)

Alernatively,返回所有结果将如下所示:

users=AdminUser.objects(email=args['email']).all() # extract all results
return jsonfiy(users)

答案 1 :(得分:2)

我一直这样做。用户模型的示例就像〜

class User(Document):
    first_name = StringField(required=True, max_length=50)
    last_name = StringField(required=True, max_length=50)
    username = StringField(required=True)
    password = StringField(required=True, min_length=6)

    def to_json(self):
        return {
            "_id": str(self.pk),
            "first_name": self.first_name,
            "last_name": self.last_name,
            "username": self.username,
            "password": self.password
        }

我将id转换为字符串。然后我会用〜

得到一个对象
user = User.objects.get(pk=user_id)
return user.to_json()

对于整个对象,但如果我只想要我想做的id ...

user.pk()

我创建了自己的to_json方法,将主键转换为字符串,否则它将返回" id":ObjectID(" SomeID")而不是整齐地打印" id":" SomeID"。 希望这可以帮助! 如果你想通过电子邮件找人,我建议〜

User.objects.get(email=args['email'])