gpt4 book ai didi

python - SQLAlchemy @property 在 Marshmallow 中使用 dump_only 导致 'Unknown Field' 错误

转载 作者:太空宇宙 更新时间:2023-11-04 09:34:19 29 4
gpt4 key购买 nike

我正在使用 flask-marshmallow(marshmallow=v3.0.0rc1,flask-marshmallow=0.9.0)和 flask-sqlalchemy(sqlalchemy=1.2.16,flask-sqlalchemy=2.3.2)

我有这个模型和架构。

from marshmallow import post_load, fields
from .datastore import sqla_database as db
from .extensions import marshmallow as ma

class Study(db.Model):
_id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False)

tests = db.relationship("Test", backref="study", lazy='select', cascade="all, delete-orphan")

@property
def test_count(self):
return len(self.tests)

class StudySchema(ma.ModelSchema):
test_count = fields.Integer(dump_only=True)
class Meta:
model = Study
sqla_session = db.session

schema = StudySchema()
payload = request.get_json()
schema.load(data=payload, instance=Study.query.get(payload["_id"]))
schema.session.commit()

如果我使用这个负载执行 PUT 操作{'_id': 1, 'name': 'Study1', 'test_count': 0} 我得到以下异常 marshmallow.exceptions.ValidationError: {'test_count': ['Unknown字段。']}

如果我删除 dump_only=True 我会得到这个异常 AttributeError: can't set attribute 这对我来说很有意义,因为它试图设置 test_count 没有 setter 方法关于模型类。

我不明白的是为什么 dump_only 没有忽略该属性。为什么 marshmallow 在标记为 dump_only 时仍在加载期间尝试验证和理解该字段?

最佳答案

在 marshmallow 2 中,未知或 dump_only 字段从输入中被忽略。除非用户决定将自己的验证添加到错误上。

在 marshmallow 3 中,我们将其更改为提供三种可能性(参见 docs ):

  • 提高(默认)
  • 排除(如棉花糖 2)
  • INCLUDE(未经验证传递数据)

已经讨论过如何处理 dump_only 字段,我们得出的结论是,从客户的角度来看,这些应该被视为未知字段(参见 https://github.com/marshmallow-code/marshmallow/issues/875)。

最重要的是,您的 PUT 负载不应包含 dump_only 字段。或者您可以将 EXCLUDE 策略设置为您的模式,但我更喜欢前一个选项。

关于python - SQLAlchemy @property 在 Marshmallow 中使用 dump_only 导致 'Unknown Field' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54391524/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com