从版本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
的内容吗?它是如何工作的?
答案 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,该方法也适用。