SQLAlchemy + Marshmallow 'Неизвестное поле.' ошибка в отношении «многие к одному», хотя поле присутствует - PullRequest
0 голосов
/ 21 апреля 2020

Моя проблема

Я работаю над приложением 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, надеясь понять ошибка, но пока не повезло.

Спасибо за любую помощь, которую вы могли бы предоставить.

...