3

有一个mongoengine文件,有几个ReferenceFields,如何将这些递归转换为 JSON?

到目前为止,我已经尝试过:

  1. to_mongo()ReferenceFields被忽略了。

  2. DeReference()(video._data),我只得到repr()每个引用模型的:

{
   'audience': 0,
   'channels': [],
   'created_date': datetime.datetime(2006, 1, 2, 12, 11, 3),
   'id': ObjectId('51af7076a2aa1c2179035e8e'),
   'images': {},
   'kind': u'VOD',
   'modified_date': datetime.datetime(2013, 6, 5, 19, 39, 4, 327000),
   'parts': [
      [<Media: VOD 0x0>,
       <Media: VOD 0x0>,
       <Media: VOD 0x0>,
       <Media: VOD 0x0>]
    ],
   'provider': <Provider: TEST>,
   'published_date': datetime.datetime(2006, 1, 2, 12, 11, 3),
   'sources': [<Source: TEST>],
   'titles': {u'en-US': u'TEST', u'es-ES': u'PRUEBA', u'pt-BR': u'TESTE'}
}

Media,ProviderSource对象没有按应有的方式序列化,还是我遗漏了什么?

4

2 回答 2

3

要获取 ReferenceField 值,您需要调用to_mongo()参考字段 - 而不是父文档,因为它只会返回文档的 DBRef 或 ObjectId。

因此,在您的示例中-您有 3 个参考字段:providerpartssources给定一个文档实例,该实例被调用my_doc以获取所引用文档的字典值:

provider = my_doc.provider.to_mongo()
parts = [part.to_mongo() for part in my_doc.parts]
sources = [source.to_mongo() for source in my_doc.sources]

** 边注

显示的架构似乎高度相关,并且 ReferenceFields 导致应用程序连接(MongoEngine 必须在内部查询并为您取消引用)。这在获取文档的所有部分时不会在高水平上执行 - 您需要为文档本身查询一次,为提供者查询一次,为部分查询一次,为源查询一次 -要检索4 个查询一份文件。对于较大的查询集,不这样做queryset.select_related(2)意味着4x 查询集计数。这可能是不希望的。

于 2013-06-13T09:46:18.747 回答
0

现在不是从 DBRef 获取数据的现成方法。但是to_mongodict conatins:

  1. 简单的项目,如数字、字符串、日期时间、ID 等。
  2. DBRef 项目
  3. 列出项目
  4. 听写项目

因此,您可以在获取并替换为to_mongo. 但是你必须检查你需要哪些引用,你必须获取多深的子引用,如何正确解析自我和递归引用。

例如看看 mongo python 驱动程序如何将 python 对象转换为自身格式:bson.json_util._json_convert.

于 2013-06-12T12:11:12.040 回答