Моя проблема
Я работаю над приложением Flask
и пытаюсь проверить схемы marshmallow
в связи с некоторыми моделями Sqlalchemy
. Для двух объектов в отношении многие-к-одному проверка не пройдена, поскольку предположительно одно из полей родительского элемента неизвестно, явно присутствует despt ie.
MWE
Я сократил свои файлы до простого MWE pytest
без ссылки на Flask
, который содержит:
- объект
Person
с string
name
который действует как первичный ключ. - объект
Submission
с простым id
первичным ключом и полем requester_name
Другими словами, один person
может сделать многие submission
, это отношение many-to-one
, которое я настроил точно так же, как в sqlalchemy do c.
Вот код:
# 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.']}
Я ожидал бы, что этот простой код будет работать, поскольку очевидно, что поле имеет значение там , и я не понимаю, почему это не так.
То, что я пытался
Поиск проблемы в inte rnet или stackoverflow не привел ни к чему, так как почти все результаты были либо люди, которые забыли передать правильные опции для своих marshmallow
схем, либо проблемы с миграцией версий.
Я также пробовал обычные иррациональные вещи, такие как изменение имен полей (ну, не так уж иррационально, чтобы проверять на опечатки), типы и т. Д.
Поэтому я создал простой MWE, надеясь понять ошибка, но пока не повезло.
Спасибо за любую помощь, которую вы могли бы предоставить.