我正在构建一个使用MongoDB和MongoEngine来存储数据的Django应用程序.为了呈现我的问题的简化版本,我想要有两个类:User和Page.每个页面应该与用户和每个用户关联页面.
from mongoengine import * class Page(Document): pass class User(Document): name = StringField() page = ReferenceField(Page) class Page(Document): content = StringField() user = ReferenceField(User)
(请注意,必须在User之前定义Page.如果我缺少处理循环依赖关系的Pythonic方法,请告诉我.)每个文档都可以创建并保存得很好,但是为用户分配页面会引发错误.
u = User(name='Jeff') u.save() p = Page(content="I'm a page!") p.save() p.user = u p.save() u.page = p u.save() Traceback (most recent call last): File "", line 1, in File "build\bdist.win32\egg\mongoengine\document.py", line 71, in save File "build\bdist.win32\egg\mongoengine\base.py", line 303, in validate mongoengine.base.ValidationError: Invalid value for field of type "ReferenceField"
任何人都可以解释为什么抛出这个异常,我做错了什么,以及如何避免它?
这是正确的解决方案:
from mongoengine import * class User(Document): name = StringField() page = ReferenceField('Page') class Page(Document): content = StringField() user = ReferenceField(User)
使用单引号('Page')表示尚未定义的类.
在这种情况下,Drew的答案是最好的方法,但我想提一下你也可以使用GenereicReferenceField:
from mongoengine import * class User(Document): name = StringField() page = GenericReferenceField() class Page(Document): content = StringField() user = ReferenceField(User)
但同样,对于您的具体问题,请使用单引号中的类名称.