python - SQLAlchemy + Marshmallow '未知字段。尽管存在字段,但多对一关系中的错误
问题描述
我的问题
我正在开发一个Flask
应用程序,并且正在尝试验证我的marshmallow
模式与某些Sqlalchemy
模型的链接。对于多对一关系中的两个对象,验证失败,因为据说父字段之一是未知的,但显然存在。
MWE
我已将我的文件简化为一个简单的 MWE pytest
,没有参考Flask
,其中包含:
Person
带有 astring
name
作为主键的对象。Submission
具有简单id
主键和字段的对象requester_name
换句话说,一个人person
可以做很多submission
,这是一种many-to-one
关系,我在 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.']}
我希望这个简单的代码能够工作,因为显然该领域在那里,我不明白为什么它不。
我试过的
在 Internet 或 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)
推荐阅读
- c# - StackExchange.Redis - 无法解释的超时异常问题
- c++ - 如何在不运行脚本的情况下在 lua 脚本中打印错误?
- android - Android Studio“运行”没有出现
- python - 我无法在基于烧瓶令牌的授权 2.o 中实现 API
- sql - EREQUEST 'END' 附近的语法不正确
- swift - Apple 系统完整性保护的 macOS 应用程序问题
- c++ - 为什么布尔变量保持负值并将其视为TRUE?
- javascript - 对象数组的lodash顺序不起作用
- oauth-2.0 - 如何使用刷新令牌在fastapi中获取访问令牌
- c# - 如何为c#中循环创建的按钮分配不同的任务