سؤال

أقوم ببناء تطبيق 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)

(لاحظ أنه يجب تعريف الصفحة أمام المستخدم. إذا فقدت طريقة بيثونية للتعامل مع التبعيات الدائرية ، فأخبرني.) يمكن إنشاء كل مستند وحفظه على ما يرام ، ولكن تعيين صفحة إلى مستخدم يرمي خطأ.

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)

استخدم علامات اقتباس واحدة ("صفحة") للدلالة على الفصول التي لم يتم تعريفها بعد.

نصائح أخرى

إجابة Drew هي أفضل طريقة في هذه الحالة ، لكنني أردت أن أذكر أنه يمكنك أيضًا استخدام GenerIcReference Field:

from mongoengine import *

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

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

ولكن مرة أخرى ، لمشكلتك المحددة ، انتقل مع اسم الفصل في اقتباسات واحدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top