ИСПРАВЛЕНИЕ ресурсов с вложенными объектами с помощью Flask/SQLAlchemy

У меня есть следующая установка:

# 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 (полный источник демо здесь)

Любые идеи, как это исправить?


person kip2    schedule 29.05.2018    source источник
comment
Почему вы рассматриваете author как атрибут, а не как отношение в полезной нагрузке? В соответствии с вашей моделью author является отношением модели book, не так ли?   -  person jelhan    schedule 26.09.2018
comment
Я делаю это, потому что author является вложенным объектом внутри book. В то же время определение author также подразумевает, что это отношение book, так что вы правы, но я не знаю, как создать или ИСПРАВИТЬ отношение без предварительной отправки двух объектов по отдельности. Хотелось бы услышать ваши мысли   -  person kip2    schedule 26.09.2018
comment
JSON API пока не поддерживает пакетные операции. Есть черновик следующей версии: github.com/json-api/json -api/pull/1254 Обработка отношений как атрибутов не является решением этого ограничения IMO.   -  person jelhan    schedule 26.09.2018