как я могу создать динамическое поле зефира (иначе программно изменить поля, используемые для сериализации)?

Допустим, у меня есть две модели и два сериализатора:

class AuthorSchema(ma.ModelSchema):
    class Meta:
        model = Author
        fields = ('id', 'name')


class BookSchema(ma.ModelSchema):
    class Meta:
        model = Book
        authors = fields.Nested(AuthorSchema, many=True)
        fields = ('id', 'title', 'authors')

Я пытаюсь создать некоторый API, в котором пользователю может потребоваться как книга, так и книга + ее авторы.

Реальная ситуация намного сложнее, и пользователь должен иметь возможность запрашивать книгу + множество других полей, поэтому создание нескольких схем на самом деле не вариант.

Как создать гибкую модель, в которой поля (в данном случае вложенные поля) можно добавлять программно?


person heapOverflow    schedule 15.05.2018    source источник


Ответы (1)


При создании сериализатора вы можете точно указать, какие поля необходимы для этого конкретного случая, используя only или include.

Например, если вы хотите сериализовать только идентификатор и название книги, вы можете сделать что-то вроде этого:

schema = BookSchema(only=('id', 'title'))

или используя exclude:

schema = BookSchema(exclude=('authors',))

Документы: https://marshmallow.readthedocs.io/en/latest/api_reference.html#schema

person dizzyf    schedule 20.05.2018