【问题标题】:Flask Mongoengine ValidationError Field is required on .save() but fields already exist in db.save() 需要 Flask Mongoengine ValidationError 字段,但 db 中已存在字段
【发布时间】:2021-07-05 13:31:22
【问题描述】:

问题:在将值附加到 EmbeddedDocumentListField 时尝试执行 .save() 时出现 ValidationError,因为我缺少文档中已存在的必填字段。

请注意,此时用户文档已作为注册过程的一部分创建,因此它已经在数据库中拥有电子邮件和密码。

我的课:

class User(gj.Document):
    email = db.EmailField(required=True, unique=True)
    password = db.StringField(required=True)
    long_list_of_thing_1s = db.EmbeddedDocumentListField("Thing1")
    long_list_of_thing_2s = db.EmbeddedDocumentListField("Thing2")

class Thing1(gj.EmbeddedDocument):
    some_string = db.StringField()

class Thing2(gj.EmbeddedDocument):
    some_string = db.StringField()

尝试将新的 EmbeddedDocument 附加到 Thing2 资源端点中我的用户类中的 EmbeddedDocumentListField:

class Thing2(Resource):
    def post(self):
        try:
            body = request.get_json()
            user_id = body["user_id"]

            user = UserModel.objects.only("long_list_of_thing_2s").get(id=user_id)

            some_string = body["some_string"]

            new_thing_2 = Thing2Model()
            new_thing_2.some_string = some_string
        
            user.long_list_of_thing_2s.append(new_thing_2)
            user.save()

            return 201
        except Exception as exception:
            raise InternalServerError
   

点击此端点时,我在user.save() 上收到以下错误

mongoengine.errors.ValidationError: ValidationError (User:603e39e7097f3e9a6829f422) (Field is required: ['email', 'password'])

我认为这是因为.only("long_list_of_thing_2s")

但我专门使用 UserModel.objects.only("long_list_of_thing_2s"),因为我不想在只想附加 long_list_of_thing_2s 的内容时将整个 UserModel 放入内存中效率低下

我应该以不同的方式解决这个问题吗?我对 Flask 和 Mongoengine 比较陌生,所以我不确定在进行此过程时所有最佳实践是什么。

【问题讨论】:

    标签: python flask mongoengine flask-restful flask-mongoengine


    【解决方案1】:

    你是对的,这是由于 .only 并且是 MongoEngine 中的一个已知“错误”。 除非您的模型非常大,否则使用 .only() 不会产生太大影响,因此我建议您仅在观察到性能问题时才使用它。

    如果您出于某种原因必须保留 .only(),您应该能够使用 push atomic operator。使用 push 操作符的一个优点是,在竞争条件(并发请求)的情况下,它将优雅地处理不同的更新,而常规的 .save() 不会覆盖列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-24
      • 2016-10-31
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多