23

我正在构建一个使用 MongoDB 和 MongoEngine 来存储数据的 Django 应用程序。为了呈现我的问题的简化版本,假设我想要两个类:用户和页面。每个页面都应该与一个用户相关联,每个用户一个页面。

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 方式,请告诉我。)可以很好地创建和保存每个文档,但是将 Page 分配给 User 会引发错误。

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 "<stdin>", line 1, in <module>
  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"

谁能解释为什么抛出这个异常,我做错了什么,以及如何避免它?

4

2 回答 2

43

这是正确的解决方案:

from mongoengine import *

class User(Document):
    name = StringField()
    page = ReferenceField('Page')

class Page(Document):
    content = StringField()
    user = ReferenceField(User)

使用单引号 ('Page') 表示尚未定义的类。

于 2010-10-08T20:02:19.867 回答
12

在这种情况下,Drew 的回答是最好的方法,但我想提一下,您也可以使用 GenereicReferenceField:

from mongoengine import *

class User(Document):
    name = StringField()
    page = GenericReferenceField()

class Page(Document):
    content = StringField()
    user = ReferenceField(User)

但同样,对于您的具体问题,请使用单引号中的类名。

于 2011-04-15T17:54:51.810 回答