2014-02-12 26 views
8

我正在嘗試使用from_json方法構建文檔對象。 object.save()不會引發錯誤,但文檔不會插入到mongo中。使用from_json製作的MongoEngine文檔對象不保存

另一方面,如果我通過爲每個字段分配值來創建對象,它可以正常工作。

我無法找到原因。以下是這兩種情況的代碼。

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() 

回答

12

甲mongoengine文檔對象可與**kwargs初始化。因此,使用此,我們可以實現以下方式from_json功能: -

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

這爲我工作。

+0

,你的一個Mongo風格的JSON字段的格式爲'timestamp:{$ date:1440027939372}',對吧? – Phlip

-1

您分配u2from_json()結果,並失去參照原來的用戶對象。

變化u2 = u2.from_json(...u2.from_json(...

+0

from_json方法返回一個**文檔對象**,並在分配給該對象的json中提供字段。 因此,這個返回的對象必須完成object.save()。 如果u2未被賦值from_json()方法返回的值,它仍然是一個空的用戶文檔對象。 – BabbarTushar

+0

u2.from_json(...沒有給原始的u2賦值, – shshank

2

from_json()轉換爲JSON數據未保存文檔實例。 保存未保存的文件是使用參數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>] 

但是,你的代碼我可以。

我不能在這裏編碼。 (我需要的單元測試夾具數據。)

我Django的環境和1.6.5 0.8.7 mongoengine

>>> 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只嘗試創建一個新的文檔。

每次使用force_insert=True都是新建一個文件。

使用force_insert=False是在數據庫中獲取文件。

+1

我沒有相當明白這個答案的大部分,但force_insert = True解決了它對我來說... –

+0

我可以涉及:D – mp3por

相關問題