2016-06-02 5 views
2

Ich habe einige Probleme mit dem _data Attribute einer mongoengine Document Instanz nach der Version 0.10.0Mongoengine 0.10.6 _data Attribut Document Instanz

zu 0.10.6 Upgrade definiere ich eine Klasse von Document vererben

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} 

Bisher habe ich mongoengine Version 0.10.0

um die dict von Daten zugreifen ein User Beispiel verwendete ich mit derbeschäftigenAttribut.

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 

Nun verbessern ich die Version von mongoengine auf Version 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 

So _data Attribut ist nicht mehr vom Typ dict und mein Code bricht, wenn ich versuche, eine Liste von Benutzern zu speichern, in ein pandas.DataFrame Tun:

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

ich kann keine Erklärung in mongoengine Changelog doc here

Kann mir jemand erklären, was ist das mongoengine.base.datastructures.SpecificStrictDict? und wie es funktioniert?

+0

Werfen Sie einen Blick auf [this] (http://stackoverflow.com/questions/6930144/underscore-vs-double-underscore-with-variables-and-methods) Antwort. Im Grunde genommen sind Namen, die mit einem einzelnen Unterstrich versehen sind, nicht für andere Codes gedacht, sie sind ein Implementierungsdetail und ihre Verwendung kann sich ändern und Ihren Code beschädigen (wie Sie gesehen haben). Ich fürchte, das hilft nicht, aber wirft Licht darauf, warum das passiert ist. – SiHa

Antwort

0

könnten Sie json.loads verwenden Sie das Dokument in das Wörterbuch zu verwandeln:

import json 

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

PS. Sie sollten nicht auf private Eigenschaften in erster Linie verlassen

0

Die Document._data wird mongoengine.base.datastructures.SpecificStrictDict, durch ihre Rep ist wie die Art und Weise Sie veröffentlicht, aber Sie können es immer noch als Diktat verwenden. some_document._data['id'] erhalten Sie ein ObjectId-Objekt.

Wenn Sie eine reine dict wollen, könnten Sie es konvertieren d = dict(some_document._data) Die Methode auch, wenn Sie frühere Versionen von mongoengine arbeitet dict zurück.