Сериализация UUID с помощью Зефир SQLAlchemy - PullRequest
1 голос
/ 26 июня 2019

Как я могу сделать marshmallow с flask-marshmallow для сериализации типов столбцов UUID Postgres?

Это примерная модель, обратите внимание на диалект UUID Postgres:

import uuid
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import scoped_session, sessionmaker

engine = create_engine('postgresql://postgres:postgres@postgres/author_db')
session = scoped_session(sessionmaker(bind=engine))
Base = declarative_base()


class Author(Base):
    __tablename__ = "authors"
    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    name = Column(String)


Base.metadata.create_all(engine)

Теперь модельная схема Marsmallow проста, прямо из примера :

from marshmallow_sqlalchemy import ModelSchema

class AuthorSchema(ModelSchema):
    class Meta:
        model = Author

Все ошибки сериализации:

author = Author(name="Chuck Paluhniuk")
author_schema = AuthorSchema()
session.add(author)
session.commit()
dump_data = author_schema.dump(author).data

Это вернет:

TypeError: Объект типа UUID не поддерживает сериализацию в формате JSON

Каков наилучший способ анализа UUID как строк?

Одним из способов является включение post_dump всхема модели:

@post_dump()
def __post_dump(self, data):
    data['id'] = str(data['id'])

Но я предпочитаю более общий подход к UUID, потому что я использую их много.

...