【问题标题】:Mongoengine: how to recursively dereference a document json-serialise them?Mongoengine:如何递归地取消引用文档 json 序列化它们?
【发布时间】:2013-06-11 13:42:34
【问题描述】:

有一个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'}
}

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

【问题讨论】:

    标签: mongodb python-2.7 mongoengine


    【解决方案1】:

    要获取 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 查询集计数。这可能不是我们想要的。

    【讨论】:

      【解决方案2】:

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

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

      因此,您可以在获取并替换为to_mongo 之后,通过列表和字典进行迭代并检查 DBRef 类型。但是你必须检查你需要哪些引用,你必须获取多深的子引用,如何正确解析自我和递归引用。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-03
        • 2018-10-07
        • 1970-01-01
        • 2014-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多