python - 尽管存在字段,但多对一关系中的 SQLAlchemy + Marshmallow 'Unknown field.' 错误

标签 python sqlalchemy marshmallow

我的问题

我正在开发一个 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/

相关文章:

python - 为什么 Google API V3 不返回 child ?

python - 值错误 : could not convert string to float: '" "'

python - 如何删除 sqlalchemy 列上的自动更新?

python - 我可以在 SQLAlchemy ORM 上使用 stream_results 吗?

python - SQLAlchemy:多个表的外键

python - Marshmallow:嵌套模式字典

flask - 蒙戈引擎 : How to update specific fields of an existing document?

Python Marshmallow : schema.loads() 返回嵌套模式的错误

python - 导入错误 : cannot import name 'Account' from 'O365' using Office 365 Project

python - 通过 bash 向 pic18f2550 中继电路发送命令