我的问题
我正在开发一个 Flask
应用程序,并且正在尝试验证我的 marshmallow
架构与某些 Sqlalchemy
模型的链接。对于多对一关系中的两个对象,验证失败,因为据称父对象的字段之一未知,但显然存在。
MWE
我已将文件简化为简单的 MWE pytest
,没有引用 Flask
,其中包含:
- 一个对象
Person
,其string
name
充当主键。 - 一个对象
Submission
,带有一个简单的id
主键和一个字段requester_name
换句话说,一个人
可以进行多次提交
,这是一种多对一
关系,我已经准确设置了就像 sqlalchemy 文档中一样。
这是代码:
# tests
from pprint import pprint
from sqlalchemy import Column, ForeignKey, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker
from marshmallow import ValidationError
from marshmallow_sqlalchemy import SQLAlchemyAutoSchema
# sqlalchemy
Base = declarative_base()
engine = create_engine("sqlite:///:memory:")
session = sessionmaker(bind=engine)()
class Person(Base):
__tablename__ = "persons"
name = Column(String(64), primary_key=True)
# MANY-TO-ONE. One Person can make many Submission
class Submission(Base):
__tablename__ = "submissions"
id = Column(Integer, primary_key=True)
requester_name = Column(String(64), ForeignKey("persons.name"))
requester = relationship("Person")
Base.metadata.create_all(engine)
# marshmallow
class PersonSchema(SQLAlchemyAutoSchema):
class Meta:
model = Person
load_instance = True
class SubmissionSchema(SQLAlchemyAutoSchema):
class Meta:
model = Submission
load_instance = True
requester = fields.Nested(PersonSchema)
def test_person():#SUCCESS
try:
PersonSchema().load({"name": "Maria"}, session=session)
assert True
except ValidationError as err:
pprint(err.messages)
assert False
def test_submission():#FAILURE
try:
SubmissionSchema().load({"requester_name": "Maria"}, session=session)
assert True
except ValidationError as err:
pprint(err.messages)
assert False
这是引发的ValidationError
:
marshmallow.exceptions.ValidationError: {'requester_name': ['Unknown field.']}
我希望这个简单的代码能够工作,因为显然该字段在那里,但我不明白为什么它不工作。
我尝试过的
在互联网或 stackoverflow 上搜索该问题毫无结果,因为几乎所有结果都与人们忘记为其 marshmallow
架构传递正确的选项或版本迁移问题有关。
我也尝试过常见的不合理的事情,例如更改字段名称(检查拼写错误并不是那么不合理)、类型等等。
所以我制作了一个简单的MWE,希望能够理解错误,但到目前为止还没有运气。
感谢您提供的任何帮助。
最佳答案
我知道这个问题不久前就被问过,但我想回答一下,以防其他人偶然发现这个问题。
我遇到了同样的问题,并根据用户 peterschutt 的此线程找到了解决方案:https://github.com/marshmallow-code/marshmallow-sqlalchemy/issues/305
尝试将 include_fk = True 添加到类元中,如下所示 - 我遇到了相同的错误,这为我修复了它,这是我进行故障排除时的第一个搜索结果之一。
class SubmissionSchema(SQLAlchemyAutoSchema):
class Meta:
model = Submission
load_instance = True
include_fk = True
requester = fields.Nested(PersonSchema)
关于python - 尽管存在字段,但多对一关系中的 SQLAlchemy + Marshmallow 'Unknown field.' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61348798/