Flask-mongoengine和select_related无法正常工作

时间:2019-04-24 19:54:30

标签: python mongodb flask mongoengine flask-mongoengine

下午好,社会! 我是Node.js的长期用户(使用Loopback,Sails等)。现在,我正在尝试使用python和Flask框架。

我正在使用python-3.7.3MongoDB 4.0.8flask 1.0.2flask-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过滤器。

非常感谢您。

0 个答案:

没有答案