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