1

mongodb データベースにデータを入力するための python スクリプトを作成しています。モデルは次のようになります。

from mongoengine import *
from mongoengine.django.auth import User

class TrackGroup (Document):
    name = StringField(required=True)
    users = ListField(ReferenceField('User'))
    devices = ListField(ReferenceField('Device'))

class Device(Document):
    name = StringField(max_length=50, required=True)
    grp = ListField(ReferenceField(TrackGroup))

class User(User):
    first_name = StringField(max_length=50)
    last_name = StringField(max_length=50)
    grp = ListField(ReferenceField(TrackGroup))

そして私のスクリプトは次のようになります:

#Create a group
gName = 'group name'
g = TrackGroup(name=gName)
g.users = []
g.devices = []
g.save()

#create a user
u = User.create_user(username='name', password='admin', email='mail@ex.com')
gRef = g
u.grp = [gRef, ]
u.first_name = 'first'
u.last_name = 'last'
u.save()
gRef.users.append(u)
gRef.save()

#create a device
dev = Device(name='name').save()
gRef = g
dev.grp = [gRef, ]
dev.save()
gRef.devices.append(dev)
gRef.save()     #Problem happens here

gRef.save()次のエラーが表示されると、問題が発生します。

raise OperationError(message % unicode(err))
mongoengine.errors.OperationError: Could not save document (LEFT_SUBFIELD only supports Object: users.0 not: 7)

しばらく見回しましたが、これは、次のように空のキーでフィールドを設定しようとしていることを意味します:(例は私のものではなく、上記のリンクからのものです)

{
    "_id" : ObjectId("4e52b5e08ead0e3853320000"), 
    "title" : "Something", 
    "url" : "http://www.website.org", 
    "" : "", 
    "tags" : [ "international"]
}

そのようなフィールドがどこから来るのかはわかりませんが、mongo シェルを開いて 3 つのコレクションのドキュメントを調べたところ、そのようなフィールドは見つかりませんでした。

注: 最初にデバイスを追加すると、ユーザーの追加後にグループを保存するときに同じエラーが発生します。

4

1 に答える 1

2

私は同じエラーがありましたが、このトリックは私にとってはうまくいきます:

the_obj_causing_error.reload()
/* make some change */
the_obj_causing_error.price = 5
the_obj_causing_error.save()

reload()オブジェクトを変更する前に試してみてください。

于 2013-06-02T09:36:29.823 に答える