Добрый день, общество!Я давний пользователь 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)
На приемеend (браузер) ответ выглядит следующим образом:
[
{
"_id": {
"$oid": "5cb953e071697c8428bea235"
},
"author": {
"$oid": "5cb952d571697c8428bea21d"
},
"body": "Message one"
},
{...},
{...},
{...}
]
Есть ли причина, по которой поле автора не заполняется фактическим объектом автора?Я что-то пропустил?
Sails.js имеет функцию .populate()
, а lb2 и lb3 имеют include
фильтр в запросах.
Большое спасибо.