«Неизвестное поле» после обновления до 3.5.0 Зефир - PullRequest
0 голосов
/ 26 марта 2020

Обновлена ​​зависимость в моем проекте

До

marshmallow-sqlalchemy==0.17.0
marshmallow==3.0.0b6

После

marshmallow-sqlalchemy==0.21.0
marshmallow==3.5.0

У меня есть такая модель (упрощенно):

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

class MyModel(Base):
    __tablename__ = 'my_model'

    id = Column(BigInteger, primary_key=True)
    field_name = Column(String)
    password = Column(String)

И схема :

from marshmallow import fields
from marshmallow_sqlalchemy import (
    ModelSchema,
    field_for,
)
class RegistrarSchema(ModelSchema):
    class Meta:
        model = MyModel

    other_field_name = fields.Function(lambda obj: obj.field_name)
    field_name = field_for(MyModel, 'field_name', load_from='other_field_name')

    password = fields.Method("get_password")

    def get_password(self, obj):
        return decrypt_password(obj)

    def load(self, data, session=None, instance=None, transient=False, *args, **kwargs):
        if 'password' in data:
            password = data['password']
            instance = encrypt_password(password, instance)
        return super(ModelSchema, self).load(
            data, *args, session=session, instance=instance,
            transient=transient, **kwargs
        )

И используя этот код, я могу вызвать

RegistrarSchema.load(data={'other_field_name': 'my_value'}, instance=instance, session=session)

, и это значение будет сохранено в field_name в моей базе данных.

После обновления я потерял этот функционал - теперь я получаю

File "myfile.py", line 116, in load
    transient=transient, **kwargs
  File "/usr/local/lib/python3.7/dist-packages/marshmallow_sqlalchemy/schema.py", line 214, in load
    return super().load(data, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/marshmallow/schema.py", line 723, in load
    data, many=many, partial=partial, unknown=unknown, postprocess=True
  File "/usr/local/lib/python3.7/dist-packages/marshmallow/schema.py", line 904, in _do_load
    raise exc
marshmallow.exceptions.ValidationError: {'other_field_name': ['Unknown field.']}

И точно такую ​​же ошибку при обновлении пароля -

RegistrarSchema.load(data={'password': 'my_value'}, instance=instance, session=session)

Я не написал это Я сам могу написать код и не могу связаться с разработчиком, который это сделал.

Как я понял, цель первого случая - дать возможность писать обоими способами - data={'my_field': 'value'} и data={'other_field_name': 'value'}. Первый сценарий все еще работает над новой версией, но второй нет.

И в случае с паролем - цель состоит в том, чтобы сделать сериализацию / десериализацию более сложной с шифрованием / дешифрованием данных.

Я читаю заметки об обновлении но не смог найти ни одного спецификатора c к этому вопросу, может кто-нибудь помочь?

...