【问题标题】:Mongoengine 0.10.6 _data attribute of Document instanceMongoengine 0.10.6 Document 实例的 _data 属性
【发布时间】:2016-06-02 15:26:52
【问题描述】:

从版本 0.10.0 升级到 0.10.6 后,我在使用 mongoengine Documentinstance 的 _data 属性时遇到了一些问题

我定义了一个继承自Document的类

from mongoengine import *

__all__ = ('User',)

connect('mydb')

class User(Document):
    user_id = IntField(unique=True)
    username = StringField()

    meta = {'indexes': ['user_id','username'],
            'index_background' : True}

到目前为止,我使用的是mongoengine 0.10.0版

为了访问Userinstance 的数据字典,我曾经处理_dataattribute。

In [1]: User.objects.first()._data
Out[1]: 
{'id':ObjectId('55b6290a10976a2a0908f8a3'),
'user_id': 1,
'username': "fake_user"}

In [15]: type(User.objects.first()._data)
Out[15]: dict

现在,我将mongoengine的版本升级到了0.10.6版

In [2]: User.objects.first()._data
Out[2]: 
{"id": 'id',
"user_id": 'user_id',
"username": 'username'} 

In [2]: type(User.objects.first()._data)
Out[2]: mongoengine.base.datastructures.SpecificStrictDict

所以_dataattribute 不再是dict 类型,当我尝试将用户列表存储在pandas.DataFrame 中时,我的代码会中断:

df = pandas.DataFrame([u._data for u in User.objects])

我在 mongoengine 更改日志文档 here 中找不到任何解释

谁能解释一下这是什么mongoengine.base.datastructures.SpecificStrictDict?以及它是如何工作的?

【问题讨论】:

  • 看看this的回答。但本质上,以单个下划线为前缀的名称并不打算被其他代码使用,它们是一个实现细节,它们的使用可能会改变和破坏您的代码(如您所见)。恐怕这无济于事,但确实可以说明为什么会发生这种情况。

标签: python python-2.7 mongoengine


【解决方案1】:

您可以使用json.loads 将您的文档转换为字典:

import json

user = User.objects.first()
json.loads(user.to_json())

PS。首先你不应该依赖私有属性

【讨论】:

    【解决方案2】:

    Document._data 变为 mongoengine.base.datastructures.SpecificStrictDict,通过它的 repr 就像您发布的方式一样,但您仍然可以将其用作 dict。 some_document._data['id'] 会给你一个 ObjectId 对象。

    如果你想要一个纯字典,你可以将它转换回字典 d = dict(some_document._data) 如果您使用的是以前版本的 mongoengine,该方法也适用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      相关资源
      最近更新 更多