2014-02-12 2 views
8

Я пытаюсь создать объект документа, используя метод from_json. object.save() не вызывает ошибки, но документ не вставлен в mongo.MongoEngine Document Объект, созданный с использованием from_json, не сохраняет

С другой стороны, если я создаю объект, присваивая значения каждому из полей, он отлично работает.

Я не могу найти причину этого. Ниже приведен код для обоих случаев.

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

и одно из полей JSON в стиле Mongo - это дата в формате 'timestamp: {$ date: 1440027939372}', правильно? – Phlip

-1

Вы назначаете u2 в результате from_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>] 

Но, ваш код я могу.

Я не могу закодировать здесь. (Мне нужно арматуре данные модульного тестирования.)

I среды Django 1.6.5 и 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 только попытаться создать новый документ.

Каждый раз, когда используется force_insert=True, создается новый документ.

Использование force_insert=False - получение документа в базе данных.

+1

Я не вполне понимаю большую часть этого ответа, но force_insert = True решил это для меня ... –

+0

Я могу связать: D – mp3por