0

问题:在将值附加到 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"),因为当我只想附加一些东西时,我不想将整个 UserModel 放入内存中效率低下long_list_of_thing_2s

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

4

1 回答 1

1

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

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

于 2021-04-10T21:33:12.383 回答