2014-02-12 10 views
8

Ich versuche, ein Dokumentobjekt mit der Methode "from_json" zu erstellen. object.save() gibt keinen Fehler aus, aber das Dokument wird nicht in mongo eingefügt.MongoEngine Document Object, das mit from_json erstellt wird, speichert nicht

Auf der anderen Seite, wenn ich das Objekt durch Zuweisen von Werten zu jedem der Felder machen, funktioniert es gut.

Ich kann den Grund dafür nicht finden. Unten ist der Code für beide Fälle.

from flask import Flask 
from flask.ext.mongoengine import MongoEngine 
import json, datetime 

app = Flask(__name__) 
app.config["MONGODB_SETTINGS"] = {'DB': 'test','host': 'localhost'} 
app.config["SECRET_KEY"] = "mySecretKey" 

db = MongoEngine(app) 
class User(db.Document): 
    user_id = db.StringField(max_length=16, primary_key = True) 
    username = db.StringField(min_length=8) 
    email = db.EmailField(required = True, unique = True) 
    password = db.StringField(required = True) 
    date_of_birth = db.DateTimeField() 
    gender = db.StringField(choices = ('M', 'F')) 

''' 
    This one works. This will add a user in local mongodb(test) 
''' 
u1 = User() 
u1.username = 'test12345' 
u1.user_id = 'testid12345' 
u1.email = '[email protected]' 
u1.password = 'testerpass' 
u1.save() 

''' 
    This one doesn't works. 
''' 
u2 = User() 
temp_json = {'username':'test2_12345','user_id':'[email protected]','password':'testerpass2','email':'[email protected]'} 
u2 = u2.from_json(json.dumps(temp_json)) 
u2.save() 

Antwort

12

Ein mongoengine Dokument-Objekt kann mit **kwargs initialisiert werden. mit diesem Somit können wir die from_json Funktionalität in der folgenden Art und Weise implementieren: -

obj_dict = { 
    'key1' : 'value1', 
    'key2' : 'value2' 
} 
user = User(**obj_dict) # User is a mongoengine document object 

Das ist für mich gearbeitet.

+0

und eines Ihrer JSON-Felder im Mongo-Stil war ein Datum im Format 'timestamp: {$ date: 1440027939372}', richtig? – Phlip

-1

Sie zuweisen u2 das Ergebnis der from_json() und Verweis auf das ursprüngliche Benutzerobjekt zu verlieren.

ändern u2 = u2.from_json(...-u2.from_json(...

+0

Die Methode from_json gibt ein ** Dokumentobjekt ** mit den Feldern zurück, die in dem dem Objekt zugewiesenen json zur Verfügung stehen. Daher muss dieses zurückgegebene Objekt object.save() durchgeführt werden. Wenn u2 nicht den von der Methode from_json() zurückgegebenen Wert zugewiesen wird, bleibt es ein leeres Benutzerdokumentobjekt. – BabbarTushar

+0

u2.from_json (... weist dem Original u2 keine Werte zu. – shshank

2

from_json() wird in JSON-Daten umgewandelt ungesicherte Dokumentinstanz. Speichern des nicht gespeicherten Dokuments verwenden Sie den Parameter force_insert=True.

... 
>>> User.objects 
[<User: test1-12345>] 
>>> u2.save() 
>>> User.objects 
[<User: test1-12345>] 
>>> u2.save(force_insert=True) 
>>> User.objects 
[<User: test1-12345>, <User: test2-12345>] 

Aber, Ihren Code kann ich.

Ich kann hier nicht codieren. (Ich brauche Fixturedaten von Unit-Test.)

I Umgebung Django 1.6.5 und mongoengine 0.8.7

>>> json_data1 = u1.to_json() 
>>> User.objects.delete() # or User.drop_collection() 
>>> User.objects 
[] 
>>> 
... 
# json_data1 to dump for pickle. Next load for pickle. 
... 
>>> u1 = User.from_json(json_data1) 
>>> u1.save() 
>>> User.objects 
[] 
>>> u1.save(force_insert=True) 
>>> User.objects 
[<User: test1-12345>] 
>>> 

force_insert=True ist nur versuchen, ein neues Dokument zu erstellen.

Jedes Mal verwenden force_insert=True ist ein neues Dokument erstellen.

Verwenden Sie force_insert=False ist Dokument in der Datenbank abrufen.

+1

tat ich nicht verstehe den größten Teil dieser Antwort, aber force_insert = True löste es für mich ... –

+0

kann ich beziehen: D – mp3por