Как я могу сделать 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, потому что я использую их много.