MongoEngine document object created using from_json function does not save

I am trying to create a document object using the from_json method. object.save () does not throw an error, but the document is not inserted into mongo.

On the other hand, if I create an object by assigning values ​​to each of the fields, it works fine.

I can not find the reason for this. Below is the code for both cases.

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 = 'test@test.com' u1.password = 'testerpass' u1.save() ''' This one doesn't works. ''' u2 = User() temp_json = {'username':'test2_12345','user_id':'testid2@12345','password':'testerpass2','email':'test2@test.com'} u2 = u2.from_json(json.dumps(temp_json)) u2.save() 
+8
python mongodb pymongo mongoengine flask-mongoengine
source share
3 answers

The mongoengine document object can be initialized with **kwargs . Thus, using this, we can implement the from_json functionality as follows: -

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

It worked for me.

+12
source share

from_json() converted to JSON data as an unsaved instance of the document. Saving an unsaved document is a parameter to use 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>] 

But, your code I can.

I can not code here. (I need unit test hardware data.)

I environment Django 1.6.5 and 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 trying to create a new document.

Each time force_insert=True is used, a new document is created.

Use force_insert=False - get the document in the database.

+2
source share

You assign u2 result from_json() and lose the reference to the original User object.

Change u2 = u2.from_json(... to u2.from_json(...

-one
source share

All Articles