10

from_json メソッドを使用してドキュメント オブジェクトを作成しようとしています。object.save() はエラーをスローしませんが、ドキュメントは mongo に挿入されません。

一方、各フィールドに値を割り当ててオブジェクトを作成すると、正常に動作します。

この理由を見つけることができません。以下は、両方のケースのコードです。

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

3 に答える 3

15

mongoengine ドキュメント オブジェクトは で初期化できます**kwargs。したがって、これを使用してfrom_json、次の方法で機能を実装できます。

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

これは私にとってはうまくいきました。

于 2014-03-15T11:21:36.613 に答える
6

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と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は、データベース内のドキュメントを取得します。

于 2014-07-19T15:53:17.897 に答える