下午好,社会! 我是Node.js的长期用户(使用Loopback,Sails等)。现在,我正在尝试使用python和Flask框架。
我正在使用python-3.7.3
,MongoDB 4.0.8
,flask 1.0.2
和flask-mongoengine 0.9.5
。我认为flask-mongoengine应该像mongoengine一样工作。
我的模型结构如下:
class User(db.Document):
email = db.EmailField(max_length=255, unique=True)
name = db.StringField(max_length=255)
class Message(db.Document):
body = db.StringField(required=True)
author = db.ReferenceField(User, required=True)
创建新用户将是这样:
u1 = User(email='user1@email.com', name='User One')
u1.save()
u2 = User(email='user2@email.com', name='User Two')
u2.save()
m1 = Message(body='Message one', author=u1)
m1.save()
m2 = Message(body='Message two', author=u1)
m2.save()
m3 = Message(body='Message three', author=u2)
m3.save()
m4 = Message(body='Message four', author=u2)
m4.save()
我需要运行查询以获取包含所有嵌套相关字段的输出,如下所示:
[
{
"body": "Message one",
"author": {
"email": "user1@email.com",
"name": "User One"
}
},
{
"body": "Message two",
"author": {
"email": "user1@email.com",
"name": "User One"
}
},
{
"body": "Message three",
"author": {
"email": "user2@email.com",
"name": "User Two"
}
},
{
"body": "Message four",
"author": {
"email": "user2@email.com",
"name": "User Two"
}
}
]
截至目前,数据库中的条目如下所示
> db.user.findOne()
{
"_id" : ObjectId("5cb952d571697c8428bea21d"),
"email" : "user1@email.com",
"name" : "User One"
}
> db.message.findOne()
{
"_id" : ObjectId("5cb953e071697c8428bea235"),
"body" : "Message one",
"author" : ObjectId("5cb952d571697c8428bea21d"),
}
我可以做一个循环,但是不实际。。。似乎select_related(max_depth=1)
应该可以解决问题。
当我这样做时:
m = Message.objects.select_related(max_depth=1)
return jsonify(messages=m)
在接收端(浏览器)上,响应如下:
[
{
"_id": {
"$oid": "5cb953e071697c8428bea235"
},
"author": {
"$oid": "5cb952d571697c8428bea21d"
},
"body": "Message one"
},
{...},
{...},
{...}
]
有没有一个原因为什么author字段中没有填充实际的author对象?我有什么想念的吗?
Sails.js具有.populate()
功能,而lb2和lb3具有查询中的include
过滤器。
非常感谢您。