我正在使用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)
答案 0 :(得分:2)
结帐the documentation,Document.objects
是QuerySet
个对象。
您似乎期待代码的这一部分
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'])