文档实例

时间:2016-06-02 15:26:53

标签: python python-2.7 mongoengine

从版本0.10.0升级到0.10.6后,我对mongoengine _data实例的Document属性有些麻烦

我定义了一个继承自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

要访问User实例的数据字典,我过去常常处理_data属性。

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

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

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

我无法在mongoengine changelog doc here

中找到任何解释

有人可以解释一下这是mongoengine.base.datastructures.SpecificStrictDict的内容吗?它是如何工作的?

2 个答案:

答案 0 :(得分:0)

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

import json

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

PS。你不应该首先依赖私有财产

答案 1 :(得分:0)

Document._data成为mongoengine.base.datastructures.SpecificStrictDict,通过其repr与您发布的方式一样,但您仍然可以将其用作词典。 some_document._data['id'] 会得到一个ObjectId对象。

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