Используйте выходной параметр порядка и укажите ключ сериализации с помощью marshmallow-sqlalchemy - PullRequest
0 голосов
/ 14 февраля 2020

Я использую зефир 3.4.0 и зефир-sqlalchemy 0.22.2

У меня есть эта модель SQLAlchemy и схема Marshmallow

class Zone(Base):
    zone_id = Column(Integer, primary_key=True)
    name = Column(String(65))
    location_id = Column(Integer, ForeignKey('locations.location_id'))
    location = relationship("Location", lazy="joined")

class ZoneSchema(SQLAlchemySchema):
    class Meta:
        model = Zone
        fields = ("zone_id", "name", "location")
        ordered = True
        load_instance = True

    zone_id = auto_field(data_key="id")
    location = fields.Nested(LocationSchema)

Если я удаляю zone_id = auto_field(data_key="id") поля заказывается в соответствии с запросом.

Если я удаляю

fields = ("zone_id", "name", "location")
ordered = True

Ключ устанавливается на id в соответствии с запросом.

Если я запускаю код выше, Я получаю эту ошибку


  File "[...]/models_schema.py", line 30, in <module>
    class ZoneSchema(SQLAlchemySchema):
  File "/venvs/backend-api/lib/python3.8/site-packages/marshmallow/schema.py", line 107, in __new__
    cls_fields = _get_fields(attrs, base.FieldABC, pop=True, ordered=ordered)
  File "/venvs/backend-api/lib/python3.8/site-packages/marshmallow/schema.py", line 57, in _get_fields
    fields.sort(key=lambda pair: pair[1]._creation_index)
  File "/venvs/backend-api/lib/python3.8/site-packages/marshmallow/schema.py", line 57, in <lambda>
    fields.sort(key=lambda pair: pair[1]._creation_index)
AttributeError: 'SQLAlchemyAutoField' object has no attribute '_creation_index'

Может кто-нибудь объяснить мне, как я могу установить доступ к полю zone_id и добавить свойство "data_key"?

1 Ответ

0 голосов
/ 20 февраля 2020

В крайнем случае, я прочитал документацию, и мне удалось найти ответ самостоятельно.

class ZoneSchema(SQLAlchemySchema):
    class Meta:
        model = Zone
        fields = ("zone_id", "name", "location")
        ordered = True
        load_instance = True

    location = fields.Nested(LocationSchema)

    @pre_dump
    def set_data_key_for_zone_id(self, data, many, **kwargs):
        self.fields.get("zone_id").data_key = "id"
        return data

Как видите, я сохранил часть ordered = True и использую декоратор предварительного дампа для доступа к полю zone_id и установки атрибута data_key.

Если есть лучший способ сделать это, пожалуйста, дайте мне / нам знать!

...