1

基本的にこのようなもの

ValidationError (MatterUser:51dc53babc6163617b38c2fe) (A ReferenceField only accepts DBRef or documents 1.A ReferenceField only accepts DBRef or documents 2.A ReferenceField only accepts DBRef or documents 3.A ReferenceField only accepts DBRef or documents 4.A ReferenceField only accepts DBRef or documents 5.A ReferenceField only accepts DBRef or documents 6.A ReferenceField only accepts DBRef or documents 7.A ReferenceField only accepts DBRef or documents 8.A ReferenceField only accepts DBRef or documents 9.A ReferenceField only accepts DBRef or documents 10.A ReferenceField only accepts DBRef or documents 11.A ReferenceField only accepts DBRef or documents 12.A ReferenceField only accepts DBRef or documents 13.A ReferenceField only accepts DBRef or documents 14.A ReferenceField only accepts DBRef or documents 15.A ReferenceField only accepts DBRef or documents 16.A ReferenceField only accepts DBRef or documents: ['groups'])

私のモデルは正しいようですが(関連するビットのみを表示しています)

class MatterUser(Document):
    groups = ListField(ReferenceField('Grouping'))
    homeGroup = ReferenceField('Grouping')
    ...


class PermissionHolder(Document):
    meta = {'allow_inheritance': True}
    ...

class Grouping(PermissionHolder):
    ...

そして、ビューの呼び出しは次のようになります

def createGroup(info):
    group = Grouping()
    group.save()
    info['owner'].groups+=group
    info['owner'].save() # The offending line

...

newUser = MatterUser(...)
newUser.save()
info = {'owner': newUser,...}
newUser.homeGroup = createGroup(info)

私が得られないのは、なぜこれほど多くの検証エラーが発生するのか、さらには何が問題なのかということです。

編集: 与えられたエラーは、ReferenceField であるモデル内のフィールドの数に等しいことにも気付きました。この場合、グループ化には 16 のフィールドがあります

4

2 に答える 2

1

うーん、やっと分かった。mongoengine がドキュメントを参照する方法と、Python がリストに追加するときに += を処理する方法のため、基本的にすべてのフィールドをリストに追加しようとしました。

に変更したところ

info['owner'].groups.append(group)

意図した動作を実行し、エラーはありませんでした

于 2013-07-09T20:28:52.670 に答える
1

Python+=では、リストに対して a を実行するには、追加する項目が反復可能である必要があります。次に、個々のアイテムがリストに追加されます。

MongoEngine では、Documents と EmbeddedDocuments は反復可能で、フィールド名を返します。

class Participant(EmbeddedDocument):
    first_name = StringField()
    last_name = StringField()

participant = Participant(first_name="Ross", last_name="Lawley")

ドキュメントをフィールド名の変数に展開できるようになりました。

field1_name, field2_name = participant

+=そのため、各フィールド名をリストに追加すると検証エラーが発生しgroupsます。あなたが本当にやりたいことは、リストに単一のアイテムを追加することです。

info['owner'].groups.append(group)
于 2013-07-10T07:57:07.773 に答える