首页 > 解决方案 > SQLAlchemy + Marshmallow '未知字段。尽管存在字段,但多对一关系中的错误

问题描述

我的问题

我正在开发一个Flask应用程序,并且正在尝试验证我的marshmallow模式与某些Sqlalchemy模型的链接。对于多对一关系中的两个对象,验证失败,因为据说父字段之一是未知的,但显然存在。

MWE

我已将我的文件简化为一个简单的 MWE pytest,没有参考Flask,其中包含:

换句话说,一个人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,希望能理解错误,但到目前为止还没有运气。

感谢您提供的任何帮助。

标签: pythonsqlalchemymarshmallow

解决方案


我知道这是不久前被问到的,但我想回答以防其他人偶然发现这个问题。

我遇到了同样的问题,并根据用户 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)

推荐阅读