Я использую колбу-зефир (зефир = v3.0.0rc1, колба-зефир = 0.9.0) и колбу-sqlalchemy (sqlalchemy = 1.2.16, колба-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 field.']}
Если я удаляю dump_only=True
Я получаю это исключение AttributeError: can't set attribute
, которое имеет смысл для меня, потому что оно пытается установить test_count без метода установки для класса модели.
Что я не понимаю, так это то, почему атрибут не игнорируется с dump_only
.Почему зефир все еще пытается проверить и понять это поле во время загрузки, когда оно помечено как dump_only
?