我正在构建一个Django应用程序,该应用程序使用MongoDB和MongoEngine存储数据。要介绍我的问题的简化版本,请说我想有两个类:用户和页面。每个页面都应将自己与用户和每个用户相关联。

from mongoengine import *

class Page(Document):
    pass

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

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

(请注意,必须在用户之前定义页面。如果我缺少一种处理循环依赖关系的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 "<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"

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

有帮助吗?

解决方案

这是适当的解决方案:

from mongoengine import *

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

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

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

其他提示

Drew的答案是在这种情况下的最佳方法,但我想提一说,您也可以使用GenereicReferendeffeeld:

from mongoengine import *

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

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

但是,对于您的特定问题,请在单个引号中使用类名。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top