Flask-mongoengine и select_related не работают должным образом - PullRequest
0 голосов
/ 24 апреля 2019

Добрый день, общество!Я давний пользователь 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 фильтр в запросах.

Большое спасибо.

...