首页 > 解决方案 > 将新字段添加到子文档后无法保存文档。使用 EmbeddedDocumentListField 引用

问题描述

我有一个文档及其子文档,它可以在不更改任何现有内容的情况下正常工作。当我向子文档添加新字段时,在保存时我得到“您只能在将文档保存到数据库后才能引用它们”

class SkillDetail(EmbeddedDocument):
    SkillName = StringField()
    EnrollDate = DateField()
    #newfield = ListField()

class Skills(Document):
    id = IntField()
    Name = StringField()
    SkillsDetails = EmbeddedDocumentField(SkillDetail)

    def update_method(self, skillNamevalue, enrolldate, newFieldValues):
        self.SkillsDetails.append(
            SkillDetail(SkillName=skillNamevalue, EnrollDate=enrolldate, newfield=newFieldValues))
        self.save()

如果没有嵌入文档中的新字段,它实际上可以正常工作。但是,当我添加新字段(SkillDetail 文档中突出显示的字段)并运行程序时,我得到了上面提到的错误。

注意:实际上我在 Skills 类中调用 update_method() 方法来为嵌入的文档赋值

请帮我解决这个问题提前谢谢

标签: mongoengineflask-mongoengine

解决方案


我必须在您的代码中修复一些东西(例如,制作 id 主键,制作SkillsDetailsa EmbeddedDocumentListField)但以下内容对我有用:

from mongoengine import *
import datetime as dt

conn = connect()

class SkillDetail(EmbeddedDocument):
   skill_name = StringField()
   enroll_date = DateField()
   newfield = ListField()

class Skills(Document):
   id = IntField(primary_key=True)
   name = StringField()
   skills_details = EmbeddedDocumentListField(SkillDetail)

   def update_method(self, skill_name, enroll_date, new_field_values):
       self.skills_details.append(SkillDetail(skill_name = skill_name, enroll_date=enroll_date, newfield = new_field_values))
       self.save()

sk = Skills(id=1, name='myname')
sk.update_method('a', dt.datetime.utcnow(), [1,2])

existing_sk = Skills.objects.first()
existing_sk.newfield
print(existing_sk.skills_details[0].newfield) # prints "[1, 2]"

推荐阅读