当前位置:  开发笔记 > 编程语言 > 正文

在MongoEngine中实现双向关系

如何解决《在MongoEngine中实现双向关系》经验,为你挑选了2个好方法。

我正在构建一个使用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"

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



1> Drew Reagan..:

这是正确的解决方案:

from mongoengine import *

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

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

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



2> 小智..:

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

from mongoengine import *

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

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

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

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有