У меня есть следующая установка:
# models
class Author(BaseModel):
id = Column(Integer, primary_key=True)
first_name = Column(String(64))
last_name = Column(String(64))
class Book(db.Model):
id = Column(Integer, primary_key=True)
title = Column(String(64))
author_id = Column(Integer,
ForeignKey("author.id"), nullable=True)
author = relationship(Author,
backref=backref('books'))
# schema
class AuthorSchema(BaseSchema):
first_name = fields.Str()
last_name = fields.Str()
class Meta(BaseSchema.Meta):
type_ = 'author'
model = Author
class BookSchema(BaseSchema):
title = fields.Str()
author_id = fields.Int()
author = fields.Nested('flask_and_restless.schemas.AuthorSchema', many=False)
class Meta(BaseSchema.Meta):
type_ = 'book'
model = Book
Я могу отправить книгу с вложенным автором с помощью этой полезной нагрузки:
{
"data": {
"attributes": {
"author": {
"data": {
"attributes": {
"first_name": "author 2",
"last_name": "last 2"
},
"type": "author"
}
},
"title": "my new title"
},
"type": "book"
}
}
Это создает нового автора вместе с новой книгой.
Однако, когда я пытаюсь ИСПРАВИТЬ с аналогичной полезной нагрузкой (тот же автор, другое название книги), как в
{
"data": {
"attributes": {
"author": {
"data": {
"attributes": {
"first_name": "author 2",
"last_name": "last 2"
},
"type": "author"
}
},
"title": "updated title 3"
},
"id": "3",
"type": "book"
}
}
Я получаю: AttributeError: 'dict' object has no attribute '_sa_instance_state'
Мой стек: Flask-SQLAlchemy, Marshmallow-JSONAPI, Flask-Restless (полный источник демо здесь а>)
Любые идеи, как это исправить?
author
как атрибут, а не как отношение в полезной нагрузке? В соответствии с вашей модельюauthor
является отношением моделиbook
, не так ли? - person jelhan   schedule 26.09.2018author
является вложенным объектом внутриbook
. В то же время определениеauthor
также подразумевает, что это отношениеbook
, так что вы правы, но я не знаю, как создать или ИСПРАВИТЬ отношение без предварительной отправки двух объектов по отдельности. Хотелось бы услышать ваши мысли - person kip2   schedule 26.09.2018