Как использовать функцию schema.dump с выдернутым ключом data_key? - PullRequest
0 голосов
/ 04 апреля 2020

Я использую Flask -Marshmallow и Flask -SQLAlchemy для выгрузки данных в API.

У меня есть опция в API для выгрузки определенных c полей в ответе:

schema = UserSchema()
schema.dump(data, only=fields)

Я получаю сообщение об ошибке, если одно из имен полей получено, если оно извлечено с помощью функции data_key:

ValueError: Invalid fields for <UserSchema()>: {'account_name'}.

УТОЧНЕНИЕ : Чтобы правильно отфильтровать это поле, клиент должен передать accountname для возврата account_name. Это нежелательно, так как клиент не подвергается внутренней реализации.

Пример кода:

class User(db.Model):
    __tablename__ = 'users'
    user_id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String)

    account = db.relationship('Account', backref='user')


class Account(db.Model):
    __tablename__ = 'accounts'
    account_id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer)
    accountname = db.Column(db.String)


class UserSchema(ma.SQLAlchemyAutoSchema):
    class Meta:
        model = User
        include_fk = True
        sqla_session = db.session

    account = ma.Pluck('AccountSchema', 'accountname', data_key='account_name')


class AccountSchema(ma.SQLAlchemyAutoSchema):
    class Meta:
        model = Account
        include_fk = True
        sqla_session = db.session

Есть ли хитрость, чтобы получить Marshmallow для сброса на основе data_key?

ОБНОВЛЕНИЕ: В настоящее время я решаю эту проблему методом грубой силы, декорируя функции контроллера с помощью картографа. Но было бы неплохо, если бы Зефир справился с этим?

1 Ответ

0 голосов
/ 04 апреля 2020

Полагаю, проблема в том, что вы передаете пользовательские данные (имена ключей со стороны клиента) в метод из мира объектов (дамп), который не предназначен для этого.

Не думаю, что это сработает даже если бы не было поля Pluck, не так ли?

Вам нужен слой, переводящий выбор пользовательского поля в мир объектов (имена полей).

Это отображение, которое вы используете. Возможно, вы могли бы сгенерировать отображение автоматически, проанализировав схемы. Это можно сделать в базовом классе схемы.

...