23

MongoDBとMongoEngineを使用してデータを保存するDjangoアプリケーションを構築しています。問題の簡略版を提示するために、UserとPageの2つのクラスが必要だとします。各ページは、それ自体をユーザーに関連付け、各ユーザーをページに関連付ける必要があります。

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"

この例外がスローされる理由、私が間違っていること、およびそれを回避する方法を誰かが説明できますか?

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 に答える