Frage

Ich baue eine Django-Anwendung, die MongoDB und MongoEngine zum Speichern von Daten verwendet. Um eine vereinfachte Version meines Problems darstellen, sage ich zwei Klassen haben will: User und Seite. Jede Seite sollte sich mit einem Benutzer zugeordnet werden und jeder Benutzer eine Seite.

from mongoengine import *

class Page(Document):
    pass

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

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

(Beachten Sie, dass Seite muss vor dem Benutzer definiert werden. Wenn ich einen Pythonic Weg bin fehlt zirkuläre Abhängigkeiten zu handhaben, lassen Sie mich wissen.) Jedes Dokument kann nur gut erstellt und gespeichert werden, sondern Seite an einen Benutzer zuweisen einen Fehler wirft .

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"

Kann mir jemand erklären, warum diese Ausnahme ausgelöst wird, was ich tue, falsch, und wie kann ich es vermeiden?

War es hilfreich?

Lösung

Dies ist die richtige Lösung:

from mongoengine import *

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

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

Verwenden Sie ( ‚Seite‘) Klassen bezeichnen, die noch nicht definiert wurde.

Andere Tipps

Drew Antwort ist der beste Weg, in diesem Fall, aber ich wollte erwähnen, dass Sie auch ein GenereicReferenceField verwenden können:

from mongoengine import *

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

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

Aber auch hier für Ihr spezielles Problem, gehen Sie mit dem Klassennamen in einfachen Anführungszeichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top