質問

MongodbとMongoengineを使用してデータを保存するDjangoアプリケーションを構築しています。私の問題の簡略化されたバージョンを提示するには、ユーザーとページの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"

この例外がスローされている理由、私が間違っていること、そしてそれを避けることができる理由を誰でも説明できますか?

役に立ちましたか?

解決

これが適切な解決策です。

from mongoengine import *

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

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

単一の引用符( 'page')を使用して、まだ定義されていないクラスを示します。

他のヒント

この場合、ドリューの答えは最良の方法ですが、GenereIcreferenceFieldを使用できることも言及したかったのです。

from mongoengine import *

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

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

しかし、繰り返しになりますが、特定の問題については、クラス名を単一の引用で進めてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top