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+=中,对列表进行操作需要您添加的项目是可迭代的。然后每个单独的项目将被附加到列表中。

在 MongoEngine 文档和 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 回答